在Dataframe中删除行时的IndexError

时间:2015-07-02 13:49:41

标签: python pandas

我有以下代码:

for (i1, row1), (i2, row2) in pairwise(df.iterrows()):
    if row1['months_to_maturity'] == row2['months_to_maturity'] and
            row1['coupon'] == row2['coupon']:
        df = df.drop(df.index[[i1]])

我想要做的是在满足以下条件的情况下摆脱行

row1['months_to_maturity'] == row2['months_to_maturity'] and
    row1['coupon'] == row2['coupon']

pairwise(df.iterrows())方法提供dataframe的当前行和下一行。

不幸的是,当我执行上面的代码时,我得到了这个错误

  

IndexError:索引12超出了轴1的大小为12

我在本节开头做了print(len(df.index))并打印了12,所以我对IndexError提出的原因感到有些困惑。

1 个答案:

答案 0 :(得分:2)

在我看来,您正在迭代行,匹配条件,然后根据满足的条件删除行。我不认为这是做你想做的事情的最佳方式。

我建议完全不同地做事情。在给定数据帧df的情况下尝试这个,

df = pd.DataFrame({'a': [1,2,3,4,4,4,5,5,5]})
df['b'] = df.a
print (df)
   a  b
0  1  1
1  2  2
2  3  3
3  4  4
4  4  4
5  4  4
6  5  5
7  5  5
8  5  5

要进入下一行,我可以做到,

df_next = df.shift()
print (df_next)
    a   b
0 NaN NaN
1   1   1
2   2   2
3   3   3
4   4   4
5   4   4
6   4   4
7   5   5
8   5   5

要查找匹配的行并删除它们,我可以这样做,

df2 = df.drop(df.index[(df.b==df_nxt.b) & (df.a==df_nxt.a)])
   a  b
0  1  1
1  2  2
2  3  3
3  4  4
6  5  5

实际上,这归结为两行代码,

df_next = df.shift()
df2 = df.drop(df.index[(df.b==df_nxt.b) & (df.a==df_nxt.a)])

这是熊猫的魔力