Слияние двух столбцов в панде DataFrame - PullRequest
1 голос
/ 08 мая 2019

Учитывая следующее DataFrame:

      A     B
0 -10.0   NaN
1   NaN  20.0
2 -30.0   NaN

Я хочу объединить столбцы A и B, заполняя ячейки NaN в столбце A значениями из столбца B, а затем отбрасывая столбец B, в результате чего получается DataFrame это:

     A
0 -10.0
1  20.0
2 -30.0

Мне удалось решить эту проблему с помощью функции iterrows().

Полный пример кода:

import numpy as np
import pandas as pd

example_data = [[-10, np.NaN], [np.NaN, 20], [-30, np.NaN]]

example_df = pd.DataFrame(example_data, columns = ['A', 'B'])

for index, row in example_df.iterrows():
    if pd.isnull(row['A']):
        row['A'] = row['B']

example_df = example_df.drop(columns = ['B'])        

example_df

Кажется, это работает нормально, но я нахожу эту информацию в документации для iterrows():

Вы не должны никогда изменять то, что вы повторяете.

Так что, похоже, я делаю это неправильно.

Какой будет лучший / рекомендуемый подход для достижения того же результата?

1 Ответ

4 голосов
/ 08 мая 2019

Использование Series.fillna с Series.to_frame:

df = df['A'].fillna(df['B']).to_frame()
#alternative
#df = df['A'].combine_first(df['B']).to_frame()
print (df)
      A
0 -10.0
1  20.0
2 -30.0

Если в столбцах больше столбцов, а для первых необходимо указать не пропущенные значения, воспользуйтесь обратным заполнением пропущенных значений, выбрав первый столбец по одному списку элементов для одного столбца DataFrame:

df = df.bfill(axis=1).iloc[:, [0]]
print (df)
      A
0 -10.0
1  20.0
2 -30.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...