首页 > 解决方案 > Pandas:比较和合并包含字典的 2 个数据框的列

问题描述

我有两个不同的数据框,如下所示,

df1:
   class   name
0  I       {'tom':2,'sam':14}
1  II      {'ram':11,'joe':1}


df2:
   class   school area            name
0  I       mount  north view, ca  {'tom':0,'sam':0,'keith':0,'jhon':0}
1  II      zion   garden city, sa {'rita':0,'tommy':0,'kelvin':0,'ram':0,'joe':0}

如何比较 df1 和 df2 并更新学校和区域的列,结果 df1 应该是?

df1:
   class   school  area            name_1              name_2
0  I       mount   north view, ca  {'tom':2,'sam':14}  {'tom':0,'sam':0,'keith':0,'jhon':0}
1  II      zion    garden city, sa {'ram':11,'joe':1}  {'rita':0,'tommy':0,'kelvin':0,'ram':0,'joe':0}

如何在下面的表达式中使用此条件,或者有其他方法吗?

  df1 = df1.merge(df2, how='left')

标签: pythonpandasmerge

解决方案


这是否达到目的?请注意,我更改了最后一行df2以查看是否正确填充了 None 值。

df1 = pd.DataFrame({'class':[1,2], 'name': [{'tom':2,'sam':14},{'ram':11,'joe':1}]})
df2 = pd.DataFrame({'class':[1,2], 'school': ['mount','zion'], 'area':['north view, ca', 'garden city, sa'], 'name': [{'tom':0,'sam':0,'keith':0,'jhon':0}, {'rita':0,'tommy':0,'kelvin':0,'ram':0}]})



df1["name_concat"] = df1["name"].apply(lambda x: tuple(x.keys()))
df2["name_concat"] = df2["name"].apply(lambda x: tuple(x.keys()))

df = df1.merge(df2, how='left', on='class', suffixes=['_1', '_2'])

df[["school", "area"]] = df.apply(
    lambda x: x[["school", "area"]] if all(x1 in x["name_concat_2"] for x1 in x["name_concat_1"]) else [None,None], axis=1)
print(df)

推荐阅读