Pandas DataFrame高级查找:无对应8400账户时8409账户level2 NaN修复
解决方案
你可以直接对merge后返回的结果调用fillna()方法,用原始的level2值填充缺失的NaN即可,修改后的代码如下:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame([['USD',7854568400,489], ['USD',9632588400,126], ['USD',3699633691,189], ['USD',9876543697,987], ['EUR',1111118409,987], ['USD',1111118409,987], ['USD',7854568409,396], ['USD',7854567893,897], ['USD',9632588409,147]], columns = ['cur','level1','level2']) # 先备份原始level2值 raw_level2 = df['level2'].copy() # 执行匹配逻辑后用原始值填充NaN df['level2'] = df.merge( df.assign(level1 = df.level1.astype(str).str.replace('8409$', '8400', regex=True).astype('int64')), on='level1', how='right' )['level2_x'].fillna(raw_level2)
可选优化
如果你的业务要求同币种的账户才能匹配,需要把merge的关联键加上cur字段,避免不同币种同账户号的错误匹配:
df['level2'] = df.merge( df.assign(level1 = df.level1.astype(str).str.replace('8409$', '8400', regex=True).astype('int64')), on=['cur', 'level1'], # 增加币种作为关联条件 how='right' )['level2_x'].fillna(raw_level2)
执行后输出结果如下,索引4、5的level2会保留原始的987:
cur level1 level2 0 USD 7854568400 489.0 1 USD 9632588400 126.0 2 USD 3699633691 189.0 3 USD 9876543697 987.0 4 EUR 1111118409 987.0 5 USD 1111118409 987.0 6 USD 7854568409 489.0 7 USD 7854567893 897.0 8 USD 9632588409 126.0
内容的提问来源于stack exchange,提问作者Alan Paul
相关产品推荐
相关产品推荐

