我有以下代码:
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
提出的原因感到有些困惑。
答案 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)])
这是熊猫的魔力