Как объединить / объединить пустой фрейм данных с другим заполненным фреймом данных с помощью равных индексов и имен столбцов? - PullRequest
6 голосов
/ 07 октября 2019

Я хочу объединить два dataframes. Один dataframe, скажем Empty_DF, пуст и имеет большой размер (320 столбцов на 240 строк) с индексами и именами столбцов только целыми числами. Другой, ROI_DF, меньше и заполнен и в определенном месте соответствует индексам и именам столбцов.

Я пытался использовать функцию pandas.merge, как было предложено в этом вопросе ;однако, это только добавило бы столбцы к пустому dataframe Empty_DF и не заменяло бы значения.

Empty_DF = pd.DataFrame({'a':[0,0,0,0,0,0],
            'b':[0,0,0,0,0,0], 'b':[0,0,0,0,0,0]}, index=list('abcdef'))

print (Empty_DF)

 ROI_DF= pd.DataFrame({'a':range(4),
            'b':[5,6,7,8]}, index=list('abce'))

 print(ROI_DF)
   a  b  c
a  0  0  0
b  0  0  0
c  0  0  0
d  0  0  0
e  0  0  0
f  0  0  0

В этом примере этого достаточно, поскольку dataframe маленький и можно использовать параметр pandas.fillna с pandas.drop. Есть ли более эффективный способ оптимизировать это для большего dataframes?

df3 = pd.merge(Empty_DF, ROI_DF, how='left', left_index=True, 
right_index=True, suffixes=('_x', ''))
df3['a'].fillna(df3['a_x'], inplace=True)
df3['b'].fillna(df3['b_x'], inplace=True)
df3.drop(['a_x', 'b_x'], axis=1, inplace=True)

print(df3)
 a  b c
a  0  5 0
b  1  6 0
c  2  7 0
d  0  0 0
e  3  8 0
f  0  0 0

Ответы [ 3 ]

3 голосов
/ 07 октября 2019

Это идеальный случай для DataFrame.update, который выравнивается по индексам

Empty_DF.update(ROI_DF)

Выход

print(df3)

     a    b  c
a  0.0  5.0  0
b  1.0  6.0  0
c  2.0  7.0  0
d  0.0  0.0  0
e  3.0  8.0  0
f  0.0  0.0  0

Обратите внимание, что update на месте, как указано в документации:

Изменить на месте, используя значения не-NA из другого DataFrame.

Это означает, что ваш оригиналдатафрейм будет обновлен новыми значениями. Чтобы предотвратить это, используйте:

df3 = Empty_DF.copy()
df3.update(ROI_DF)
2 голосов
/ 07 октября 2019

Вы можете использовать update:

Empty_DF.update(ROI_DF)

выход:

     a    b  c
a  0.0  5.0  0
b  1.0  6.0  0
c  2.0  7.0  0
d  0.0  0.0  0
e  3.0  8.0  0
f  0.0  0.0  0

Или loc:

Empty_DF.loc[ROI_DF.index, ROI_DF.columns] = ROI_DF

выход:

   a  b  c
a  0  5  0
b  1  6  0
c  2  7  0
d  0  0  0
e  3  8  0
f  0  0  0
0 голосов
/ 07 октября 2019

В вашем случае reindex_like

yourdf=ROI_DF.reindex_like(Empty_DF).fillna(0)
     a    b    c
a  0.0  5.0  0.0
b  1.0  6.0  0.0
c  2.0  7.0  0.0
d  0.0  0.0  0.0
e  3.0  8.0  0.0
f  0.0  0.0  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...