Pandas使用Lambda比较两列货币值,逻辑判断结果异常求排查
问题排查与修复
核心问题分析
你的代码有三个关键错误,导致空值相关的判断逻辑完全无法触发:
- 空值判断不匹配:你把字符串
'nan'替换成了空字符串'',但代码里用x['a']==None判断空值——空字符串和None是完全不同的对象,这个判断永远为假。 - 逻辑顺序错误:
a和b都为空的判断放在了最后,而前面的a为空或b为空条件会先匹配,导致这个场景永远不会被触发。 - 结果文本不符需求:代码里写的
'Same'和需求里的'same'大小写不一致,'a & b missing'也和需求的'all missing'不符。
修复后的代码
import pandas as pd # 货币列表 a = ('USD USD CAD nan JMD nan HKD CAD').split() b = ('USD CAD RMB HKD nan nan USD EUR').split() df = pd.DataFrame(list(zip(a, b)), columns=['a', 'b']) df = df.replace('nan', '') df['c'] = df.apply(lambda x: 'all missing' if x['a'] == '' and x['b'] == '' else 'same' if x['a'] == x['b'] else 'a missing' if x['a'] == '' else 'b missing' if x['b'] == '' else 'diff currency', axis=1)
修复说明
- 对齐空值判断:把
==None改成=='',和你替换后的空值类型匹配。 - 调整判断优先级:把
a和b都为空的判断放在最前面,避免被其他空值条件覆盖;再依次判断a==b、单空情况,最后处理货币不同的场景。 - 统一结果文本:完全对齐你需求里的文本内容(比如
'same'、'all missing')。
运行后df['c']的结果会完全符合预期:
0 same 1 diff currency 2 diff currency 3 diff currency 4 diff currency 5 all missing 6 diff currency 7 diff currency Name: c, dtype: object
内容的提问来源于stack exchange,提问作者Alan H
相关产品推荐
相关产品推荐

