Панды: слева объединить несколько DFS и обновить значения NaN
У меня есть 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 сразу из-за оперативной памяти.
Стандартное "левое соединение"...
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 ответа
Решение
Это больше похоже на 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
Вы ищете что-то подобное?
Сначала мы используем 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)