我有一个ID为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
注意:由于RAM,我无法一次加载所有df。
标准的“左连接” ...
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做到这一点?
答案 0 :(得分:2)
您是否正在寻找类似的东西?
首先,我们使用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)
答案 1 :(得分: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