python - 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 中 "name" 列的所有键都在 df2 的 "name" 列键中,则必须在 df1 上更新相应行的 "school" 和 "area" 列。
- 如果 df1 中“name”列的所有键都不在 df2 的“name”列键中,则必须在 df1 上将相应行的“school”和“area”列更新为 None。
如何在下面的表达式中使用此条件,或者有其他方法吗?
df1 = df1.merge(df2, how='left')
解决方案
这是否达到目的?请注意,我更改了最后一行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)
推荐阅读
- java - SDK 未注册(来自非视图构造函数,而不是 onCreate()) - 没有错误
- r - optmi方法梯度函数如何使用?
- reactjs - 当用户位于某个组件时,如何将我的按钮或图标颜色设置为不同?
- python - 为什么 python 在使用 . 导入时给出“ModuleNotFoundError: No module named '__main__.xxx'; '__main__' is not a package”?
- c++ - 为什么要在 C++ 中预定义模板参数类型?
- c - 打印到标准输出返回 gibbersih
- javascript - 为什么 style.display = "none"; 不适用于响应式导航栏
- java - (Java NIO)我应该在通道之间复制时检查字节读取和缓冲区位置吗?
- wordpress - WordPress 全新安装未将默认插件和主题更新到最新版本
- python - 正则表达式 - 如何捕获之前没有不同模式的模式?