Pandas DataFrame高级查询:新增货币列后ParentID匹配报错求助
报错原因
新增cur字段后,不同币种下允许重复的level1账号存在,直接将level1设为索引会产生重复索引值,触发InvalidIndexError: Reindexing only valid with uniquely valued Index objects错误。
解决代码
我们通过复合键映射+指定范围修改的逻辑实现需求,仅修改USD币种、后缀为8409的账号level2值,其余账号保留原值:
import pandas as pd import numpy as np # 带cur字段的测试数据 df = pd.DataFrame([ [7854568400,489, 'USD'], [9632588400,126, 'USD'], [3699633691,189, 'CNY'], [9876543697,987, 'EUR'], [1111118409,987, 'CNY'], [7854568409,396, 'USD'], [7854567893,897, 'USD'], [9632588409,147, 'USD'] ], columns = ['level1','level2', 'cur']) # 构造 (level1, 币种) 到level2的唯一映射,避免同账号多币种重复问题 level_map = df.set_index(['level1', 'cur'])['level2'].to_dict() # 初始化新列值为原始level2 df['new_level2'] = df['level2'] # 筛选需要修改的行:USD币种 + level1后缀为8409 update_mask = (df['cur'] == 'USD') & (df['level1'].astype(str).str.endswith('8409')) # 生成替换后的查询key(后缀替换为8400的level1 + 对应币种) replace_level1 = df.loc[update_mask, 'level1'].astype(str).str.replace('8409$', '8400', regex=True).astype('int64') query_keys = list(zip(replace_level1, df.loc[update_mask, 'cur'])) # 匹配映射值,匹配不到则保留原值 df.loc[update_mask, 'new_level2'] = [ level_map.get(key, df.loc[idx, 'level2']) for idx, key in zip(replace_level1.index, query_keys) ] # 转换为合适的数据类型 df['new_level2'] = df['new_level2'].convert_dtypes() print(df)
输出效果
运行代码后结果如下,仅两个USD币种的8409后缀账号level2被修正:
| level1 | level2 | cur | new_level2 |
|---|---|---|---|
| 7854568400 | 489 | USD | 489 |
| 9632588400 | 126 | USD | 126 |
| 3699633691 | 189 | CNY | 189 |
| 9876543697 | 987 | EUR | 987 |
| 1111118409 | 987 | CNY | 987 |
| 7854568409 | 396 | USD | 489 |
| 7854567893 | 897 | USD | 897 |
| 9632588409 | 147 | USD | 126 |
内容的提问来源于stack exchange,提问作者Alan Paul
相关产品推荐
相关产品推荐

