使用pandas移动值并创建新索引

3

我有一个df对象

            2019            2020            2021            2022

A           10              20              30              40

我正在尝试创建两个新的索引A-1A-2,以便输出看起来像这样:

            2019            2020            2021            2022

A           10              20              30              40
A-1         nan             10              20              40
A-2         nan             nan             10              20

我尝试过:

s = df.loc['A',:].shift(1, axis=0)
s = s.rename({'A': 'A-1'}, axis = 0)
df = df.combine_first(s)

但是在执行----> 3 df= df.combine_first(s)时出现错误:

ValueError: 必须指定axis=0或1

当我添加 axis = 0 后,得到以下错误:

TypeError: combine_first() 函数不接受关键字参数 'axis'

因此,我不确定我的错误在哪里。

2个回答

1
你需要稍微改变一下策略。combine_first在这里不太合适。相反,使用concat,并将数据保留为DataFrame格式:
pd.concat([df, df.loc[['A']].shift(1, axis=1).rename(index={'A': 'A-1'})])

输出:

     2019  2020  2021  2022
A    10.0    20    30    40
A-1   NaN    10    20    30

程序化地进行班次调整

如果您需要进行多个班次调整,可以使用编程方式实现:

n = 3
df2 = pd.concat([df]+[(df.loc[['A']].shift(i+1, axis=1)
                         .rename(index={'A': f'A-{i+1}'})
                      ) for i in range(n)])

输出:

     2019  2020  2021  2022
A    10.0  20.0  30.0    40
A-1   NaN  10.0  20.0    30
A-2   NaN   NaN  10.0    20
A-3   NaN   NaN   NaN    10
使用Series

如果你只需要移动单行,那么使用Series更加方便:

n = 3
row = 'A'
s = df.loc[row]
df2 = pd.concat([s]+[s.shift(i+1).rename(f'{row}-{i+1}') for i in range(n)],
                axis=1).T

输出:

     2019  2020  2021  2022
A    10.0  20.0  30.0    40
A-1   NaN  10.0  20.0    30
A-2   NaN   NaN  10.0    20
A-3   NaN   NaN   NaN    10

1

只需使用loc创建您的新索引

>>> df = pd.DataFrame({2019:[10], 2020:[20], 2021:[30], 2022:[40]}, index=["A"])
>>> df.loc["A-1"] = df.loc["A"].shift()
>>> df.loc["A-2"] = df.loc["A-1"].shift()
>>> df
     2019  2020  2021  2022
A    10.0  20.0  30.0  40.0
A-1   NaN  10.0  20.0  30.0
A-2   NaN   NaN  10.0  20.0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接