Панды: слева объединить несколько DFS и обновить значения NaN - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть df с идентификаторами

   id
0   1
1   2
2   3
3   4

, и мне нужно «присоединить влево» (или объединить влево) несколько фреймов данных, один за другим.

    id   text
0    1  Hello
1    2  World
2  100  Hello

и

    id   text
0    3  World
1  101  Hello

Примечание: я не могу загрузить все dfs сразу из-за ОЗУ.

Стандартный "left-join "...

import pandas as pd
df1 = pd.DataFrame({'id': [1,2,3,4]})
df2 = pd.DataFrame({'id': [1,2,100],
                    'text': ['Hello', 'World','Hello']})
df3 = pd.DataFrame({'id': [3,101],
                    'text': ['World', 'Hello']})

m1 = pd.merge(left=df1, right=df2, on="id", how="left")
m2 = pd.merge(left=m1, right=df3, on="id", how="left")

... дает мне:

   id text_x text_y
0   1  Hello    NaN
1   2  World    NaN
2   3    NaN  World
3   4    NaN    NaN

Однако я хотел бы" обновить "столбец с правым соединением, чтобы я получил:

   id text
0   1  Hello
1   2  World
2   3  World
3   4    NaN

Есть ли способ сделать это с помощью pd.merge?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Это больше похоже на update проблему

df1['text']=np.nan
df1.set_index('id',inplace=True)
df1.update(df2.set_index('id'))
df1.update(df3.set_index('id'))
df1.reset_index(inplace=True)
df1
Out[54]: 
   id   text
0   1  Hello
1   2  World
2   3  World
3   4    NaN
0 голосов
/ 28 февраля 2019

Вы ищете что-то подобное?

Сначала мы используем np.where для условного заполнения нашего столбца text, после чего мы отбрасываем ненужные столбцы.


m2['text'] = np.where(m2.text_x.isnull(), m2.text_y, m2.text_x)
m2.drop(['text_x', 'text_y'], axis=1, inplace=True)


    id  text
0   1   Hello
1   2   World
2   3   World
3   4   NaN

Пояснение

np.where работает следующим образом:
np.where(condition, true value, false value)

...