关于 pandas dataframe 反转列的数据顺序
about pandas dataframe reverse column's data order
代码
import pandas as pd
import numpy as np
df = pd.DataFrame({"K1":[1,2,3],"K2":[4,5,6]})
df["result"] = (df["K1"].shift(1)*df["K2"]).fillna(1)[::-1] #line A
print(df["result"])
print((df["K1"].shift(1)*df["K2"]).fillna(1)[::-1]) #line B
print((df["K1"].shift(1)*df["K2"]).fillna(1)) # line C
输出
0 1.0
1 5.0
2 12.0
Name: result, dtype: float64
2 12.0
1 5.0
0 1.0
dtype: float64
0 1.0
1 5.0
2 12.0
dtype: float64
为什么列结果在 A 行中没有得到相反的顺序但在 B 行中有效?
通过使用 [::-1]
,您正在反转系列,包括索引(正如您在打印中看到的那样)。因此,index-value 对保持不变。 Pandas 将使用系列索引将其与 df
DataFrame 中的现有索引对齐。要解决这个问题,您需要将原始值分配给列,而不是 Pandas 系列,例如通过使用 .to_numpy()
.
df["result"] = (df["K1"].shift(1)*df["K2"]).fillna(1).to_numpy()[::-1] #line A
代码
import pandas as pd
import numpy as np
df = pd.DataFrame({"K1":[1,2,3],"K2":[4,5,6]})
df["result"] = (df["K1"].shift(1)*df["K2"]).fillna(1)[::-1] #line A
print(df["result"])
print((df["K1"].shift(1)*df["K2"]).fillna(1)[::-1]) #line B
print((df["K1"].shift(1)*df["K2"]).fillna(1)) # line C
输出
0 1.0
1 5.0
2 12.0
Name: result, dtype: float64
2 12.0
1 5.0
0 1.0
dtype: float64
0 1.0
1 5.0
2 12.0
dtype: float64
为什么列结果在 A 行中没有得到相反的顺序但在 B 行中有效?
通过使用 [::-1]
,您正在反转系列,包括索引(正如您在打印中看到的那样)。因此,index-value 对保持不变。 Pandas 将使用系列索引将其与 df
DataFrame 中的现有索引对齐。要解决这个问题,您需要将原始值分配给列,而不是 Pandas 系列,例如通过使用 .to_numpy()
.
df["result"] = (df["K1"].shift(1)*df["K2"]).fillna(1).to_numpy()[::-1] #line A