迭代遍历pandas中的行

时间:2017-05-14 07:44:12

标签: pandas

我有以下数据框:

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属性进行迭代在其他场合中正常工作,这是非常令人困惑的。

我们非常感谢您的帮助。

2 个答案:

答案 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的迭代
请注意我做了三件事来修复你的代码:

  1. 我将columns添加到您的初始数据框
  2. range0len(df0) - 1
  3. 我查找了位置i的索引值,因此我可以使用loc分配新行
  4. 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

解决方案:

sub + shift + abs

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