我有以下数据框:
df0: A B C
Date
2017-04-13 884.669983 139.389999 46.900002
2017-04-17 901.989990 141.419998 47.389999
2017-04-18 903.780029 140.960007 47.560001
2017-04-19 899.200012 142.270004 47.000000
2017-04-20 902.059998 143.800003 47.669998
2017-04-21 898.530029 143.679993 47.520000
我只是期待创建一个新的数据框main_df
,它会从行i+1
中减去i
中的行,并将结果行转换为绝对数字并引入它进入新的数据框:
以下是我的尝试:
main_df=pd.DataFrame()
for i in range(len(df0)):
main_df.iloc[i]=np.absolute(df0.iloc[i+1]-df0.iloc[i])
print(main_df)
输出错误single positional indexer is out-of-bounds
考虑到使用iloc
属性进行迭代在其他场合中正常工作,这是非常令人困惑的。
我们非常感谢您的帮助。
答案 0 :(得分:3)
<强> pandas
强>
使用diff
main_df = df0.diff(-1).abs()
A B C
Date
2017-04-13 17.320007 2.029999 0.489997
2017-04-17 1.790039 0.459991 0.170002
2017-04-18 4.580017 1.309997 0.560001
2017-04-19 2.859986 1.529999 0.669998
2017-04-20 3.529969 0.120010 0.149998
2017-04-21 NaN NaN NaN
numpy
main_df = pd.DataFrame(
np.abs(np.diff(df0.values, axis=0)),
df0.index[:-1], df0.columns
)
A B C
Date
2017-04-13 17.320007 2.029999 0.489997
2017-04-17 1.790039 0.459991 0.170002
2017-04-18 4.580017 1.309997 0.560001
2017-04-19 2.859986 1.529999 0.669998
2017-04-20 3.529969 0.120010 0.149998
OP的迭代
请注意我做了三件事来修复你的代码:
columns
添加到您的初始数据框range
从0
到len(df0) - 1
i
的索引值,因此我可以使用loc
分配新行main_df = pd.DataFrame(columns=df0.columns)
for i in range(len(df0) - 1):
idx = df0.index[i]
main_df.loc[idx] = np.absolute(df0.iloc[i+1]-df0.iloc[i])
A B C
Date
2017-04-13 17.320007 2.029999 0.489997
2017-04-17 1.790039 0.459991 0.170002
2017-04-18 4.580017 1.309997 0.560001
2017-04-19 2.859986 1.529999 0.669998
2017-04-20 3.529969 0.120010 0.149998
答案 1 :(得分:2)
最后一个循环中存在问题 - 您尝试选择行不在df(iloc[i+1]
)中,因此请error
。
解决方案:
df = df.sub(df.shift(-1)).abs()
print (df)
A B C
Date
2017-04-13 17.320007 2.029999 0.489997
2017-04-17 1.790039 0.459991 0.170002
2017-04-18 4.580017 1.309997 0.560001
2017-04-19 2.859986 1.529999 0.669998
2017-04-20 3.529969 0.120010 0.149998
2017-04-21 NaN NaN NaN
如果需要删除上一个NaN
行,请使用iloc
选择所有行而不是最后一行:
df = df.sub(df.shift(-1)).abs().iloc[:-1]
print (df)
A B C
Date
2017-04-13 17.320007 2.029999 0.489997
2017-04-17 1.790039 0.459991 0.170002
2017-04-18 4.580017 1.309997 0.560001
2017-04-19 2.859986 1.529999 0.669998
2017-04-20 3.529969 0.120010 0.149998