我有一个df
2019 2020 2021 2022
A 10 20 30 40
我正在尝试创建两个新索引A-1
和A-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:必须指定轴=0或1
当我添加axis = 0
时,我得到:
类型错误:combine_first((获得了意外的关键字参数"axis">
所以我不确定我的错误在哪里。
您需要稍微改变一下您的策略。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
使用系列
如果你真的只需要移动一行,那么使用系列会更容易
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
Juste使用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