如何在Pandas链式调用中基于外连接结果赋值status列?
解决Pandas链式调用添加status列的问题
你的问题出在注释的assign写法错误,无法根据_merge列的值正确映射status。下面是两种符合链式调用要求的正确实现方式:
方法一:用map直接映射(最简洁)
利用字典映射关系,直接对_merge列做转换生成status列,一步到位:
import pandas as pd A = pd.DataFrame({ 'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4] }) B = pd.DataFrame({ 'key': ['C', 'D', 'E', 'F'], 'value': [3, 4, 5, 6] }) merged = (pd.merge(A, B, on='key', how='outer', indicator=True) .assign(status=lambda x: x['_merge'].map({'both':'no change','left_only': 'added','right_only': 'removed'})) .drop('_merge', axis=1) ) print(merged)
方法二:链式调用中用mask分步赋值
如果需要分步修改status列,可通过mask函数在链式调用中逐步替换值:
import pandas as pd A = pd.DataFrame({ 'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4] }) B = pd.DataFrame({ 'key': ['C', 'D', 'E', 'F'], 'value': [3, 4, 5, 6] }) merged = (pd.merge(A, B, on='key', how='outer', indicator=True) .assign(status='no change') .assign(status=lambda x: x.status.mask(x._merge == 'left_only', 'added')) .assign(status=lambda x: x.status.mask(x._merge == 'right_only', 'removed')) .drop('_merge', axis=1) ) print(merged)
说明
- 方法一的
map通过固定字典完成值转换,代码最简洁,适配这种明确键值对的场景。 - 方法二用
mask函数在链式调用中逐步替换status值,适合需要更复杂逻辑的修改场景。 - 链式调用中要避免直接用
x.loc[...]赋值,因为需要返回修改后的DataFrame,mask或map能生成新列,符合链式调用的要求。
内容的提问来源于stack exchange,提问作者gregV
相关产品推荐
相关产品推荐

