You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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被修正:

level1level2curnew_level2
7854568400489USD489
9632588400126USD126
3699633691189CNY189
9876543697987EUR987
1111118409987CNY987
7854568409396USD489
7854567893897USD897
9632588409147USD126

内容的提问来源于stack exchange,提问作者Alan Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:36:01