2015-07-02 1 views
1

У меня есть следующий код:IndexError при удалении строки в Dataframe

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: index 12 is out of bounds for axis 1 with size 12

я сделал print(len(df.index)) в начале этого раздела и получил 12 печататься, поэтому я немного запутался, почему IndexError повышается.

+1

Почему бы не использовать drop_duplicates на основе двух столбцов? 'df.drop_duplicates (('months_to_maturity', 'coupon'), inplace = True)' –

+0

Должны ли повторяющиеся строки появляться смежно или вы хотите удалить дубликаты везде, где они появляются? – unutbu

+0

@PadraicCunningham Thank You. Я просто предположил, что не смогу использовать его для определенных столбцов. – user131983

ответ

2

Мне кажется, что вы выполняете итерацию по строкам, соответствуя условию, а затем отбрасываете строки на основе условия, которое выполняется. Я не думаю, что это оптимальный способ делать то, что вы пытаетесь сделать.

Я собираюсь рекомендовать, чтобы все было по-другому. Попробуйте это, учитывая dataframe Д.Ф.,

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)]) 

Это волшебство панд

Смежные вопросы