Представьте, что у меня есть эти данные:

df = pd.DataFrame([['aa', np.nan, 'cc', 'dd', 'ee', np.nan, 'gg'], ['aa', 'bb', 'cc', 'cc', 'ee', 'dd', 'gg'], ['aa', 'bb', 'cc', 'cc', 'ee', 'dd', 'gg']]).T.rename(columns = {0: 'col_1', 1: 'col2', 2: 'col_3'})

    col_1   col2    col_3
0      aa     aa       aa
1      NaN    bb       bb
2      cc     cc       cc
3      dd     cc       cc
4      ee     ee       ee
5      NaN    dd       dd
6      gg     gg       gg

Теперь я извлекаю строки, где есть nans:

df_null = df[df['col_1'].isnull()]
df_null

    col_1   col2    col_3
1     NaN     bb       bb
5     NaN     dd       dd

Затем я удаляю эти строки из основного df и выполняю любые преобразования и операции в нем:

df_no_null = df[~df['col_1'].isnull()]
df_no_null.do_stuff()....

Теперь я беру строки со значениями nan и делаю с ними больше вещей:

df_null.at[1, 'col_1'] = 'bb'
df_null.at[5, 'col_1'] = 'dd'

df_null

    col_1   col2    col_3
1      bb     bb       bb
5      dd     dd       dd

Теперь я хочу снова вставить строки df_null в исходный df, но я хочу вернуть эти строки в исходное положение индекса, чтобы результат был таким же, как и у оригинального df с его индекс не поврежден:

   col_1    col2    col_3
0     aa      aa       aa
1     bb      bb       bb
2     cc      cc       cc
3     dd      cc       cc
4     ee      ee       ee
5     dd      dd       dd
6     gg      gg       gg

Как я могу выполнить такую операцию в pandas?

< Сильный > Примечание :

Обратите внимание, что это просто игрушка, предоставленный ответ должен работать намного эффективнее df и иметь гораздо больше nans, намного больше строк, которые можно вставить обратно в исходный df

Заранее большое спасибо

< Сильный > EDIT :

Строки должны быть вставлены обратно в df_no_null, чтобы уважать предыдущие операции и вещи, выполненные в этой.

1
Miguel 2488 23 Апр 2020 в 15:04

2 ответа

Лучший ответ

Я думаю, вам нужно выбрать столбцы с помощью {{X0 } } :

df.loc[df_null.index] = df_null
print (df)
  col_1 col2 col_3
0    aa   aa    aa
1    bb   bb    bb
2    cc   cc    cc
3    dd   cc    cc
4    ee   ee    ee
5    dd   dd    dd
6    gg   gg    gg

РЕДАКТИРОВАТЬ: Для решения петли возможно использование:

for i in df_null.index:
    df.loc[i] = df_null.loc[i]
print (df)
  col_1 col2 col_3
0    aa   aa    aa
1    bb   bb    bb
2    cc   cc    cc
3    dd   cc    cc
4    ee   ee    ee
5    dd   dd    dd
6    gg   gg    gg
3
jezrael 23 Апр 2020 в 12:25

Я думаю, что следующее может помочь вам

Df = Insert_row_ (row_number, df, row_value)

В твоем случае:

Df = Insert_row_ (1, df, NaN)

Df = Inser_row_ (5, df, NaN)

0
Dejene T. 23 Апр 2020 в 12:41