使用panda转换值并创建新索引



我有一个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:必须指定轴=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

最新更新