假设我有以下 main df:
df = pd.DataFrame({'name':['Sara', 'John', 'Christine']})
df:
name
0 Sara
1 John
2 Christine
现在我还有另外 4 个 dfs,它们的年龄和等级分别为 3 个用户名,但 NaN 排列不同:
df2 = pd.DataFrame({'name':['Sara', 'John', 'Christine'],
'age': [26, 30, np.nan]})
df3:
df3 = pd.DataFrame({'name': ['Sara', 'John', 'Christine'],
'age': [np.nan, 30, 24]})
df4:
df4 = pd.DataFrame({'name': ['Sara', 'John', 'Christine'],
'grade': [np.nan, 1, 3]})
df5:
df5 = pd.DataFrame({'name': ['Sara', 'John', 'Christine'],
'grade': [12, np.nan, 3]})
我想将 4 个数据帧中的数据合并到 df
列上的主 name
并删除 NaN。
到目前为止我做了什么:
创建一个 dfs 列表:
dfs = [df,df2,df3,df4,df5]
使用过的reduce
:
from functools import reduce
df_final = reduce(lambda left,right: pd.merge(left,right,on='name'), dfs)
df_final:
name age_x age_y grade_x grade_y
0 Sara 26.0 NaN NaN 12.0
1 John 30.0 30.0 1.0 NaN
2 Christine NaN 24.0 3.0 3.0
预期输出:
df_final:
name age grade
0 Sara 26.0 12
1 John 30.0 1.0
2 Christine 24.0 3.0
答案 0 :(得分:1)
我们可以尝试将 long 与 concat
合并,然后使用 groupby first
检索每个名称的每个列的第一个有效条目:
merged = (
pd.concat(dfs).groupby('name', sort=False, as_index=False).first()
)
merged
:
name age grade
0 Sara 26.0 12.0
1 John 30.0 1.0
2 Christine 24.0 3.0