Самый эффективный способ объединения нескольких фреймов данных с дополнительными пропущенными значениями - PullRequest
3 голосов
/ 05 мая 2020

Это, вероятно, довольно простой c вопрос. Предположим, у меня есть два фрейма данных:

>>> df1
   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3   NaN
4   4   NaN
5   5   NaN

>>> df2
   id     a
0   0   NaN
1   1   NaN
2   2   NaN
3   3  20.0
4   4  25.0
5   5  30.0


Я хочу присоединиться к фреймам данных на id, чтобы они выглядели так:

>>> df_joined
   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0

До сих пор я выполнял левые слияния, например df1.merge(df2, how = 'left', on = 'id), но это приводит к дублированию столбцов (см. Ниже), которые я должен исправить, заполнив nans, переименовав столбцы, а затем отбросив дубликат. Это становится особенно утомительным, если мне нужно объединить более двух фреймов данных.

# How do I better merge this so I don't have fill nans, rename, and drop the columns?
   id   a_x   a_y
0   0   5.0   NaN
1   1  10.0   NaN
2   2  15.0   NaN
3   3   NaN  20.0
4   4   NaN  25.0
5   5   NaN  30.0

Какой лучший способ сделать это?

1 Ответ

4 голосов
/ 05 мая 2020

IIU C, DataFrame.combine_first

df1.combine_first(df2)

   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0

EDIT

Мы можем использовать DataFrame.set_index + DataFrame.combine_first с map и reduce для n DataFrames.

my_list_df = [df1, df2]

from functools import reduce
reduce(lambda new_df,  df_to_combine: new_df.combine_first(df_to_combine), 
       map(lambda df: df.set_index('id'), my_list_df)).reset_index()

Выход

   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0

В этом случае нам нужно только reduce:

reduce(lambda new_df, df_to_combine: new_df.combine_first(df_to_combine.set_index('id')),
       my_list_df[1:], my_list_df[0].set_index('id')).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...