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

Pandas数据集提取货币标识并赋值失败问题求助

Pandas批量识别货币并赋值的问题解决

问题场景

有一个Pandas数据集,Amount列包含带货币符号(如$)或后缀(如MYR、CNY)的金额,需要给Currency_Name和FX列赋值以标识对应货币。

尝试用for循环判断Amount中的$符号,通过assign方法赋值,但最终所有行的Currency_Name均为USD、FX均为1;但单独执行打印测试时,循环逻辑显示正常。

数据集示例

import pandas as pd

df_currency= pd.DataFrame(columns=["Amount", "Currency_Name", "FX"])
# 假设mcapnum_test是预定义的Amount列数据
df_currency["Amount"] = mcapnum_test

数据集预览:

Amount Currency_Name   FX
0         $3692391833           NaN  NaN
1        $17868370525           NaN  NaN
2        $51376239909           NaN  NaN
3       $139591325133           NaN  NaN
4        $54863164472           NaN  NaN
..                ...           ...  ...
491   14139547170 MYR           NaN  NaN
492       $2293285351           NaN  NaN
493      $10892645287           NaN  NaN
494  278539272091 CNY           NaN  NaN
495      $38316261938           NaN  NaN

用户原循环代码

USD = "$"
for wordcheck in mcapstr:
    if USD in wordcheck:
        df_currency = df_currency.assign(FX=lambda x: 1) 
        df_currency = df_currency.assign(Currency_Name=lambda x: "USD")
    else:
        df_currency = df_currency.assign(FX=lambda x: "TBD")
        df_currency = df_currency.assign(Currency_Name=lambda x: "Other")

错误原因

  • df.assign()方法会覆盖整个列的所有值,而非仅修改当前循环对应的行。循环执行到最后一行时,会将之前所有行的赋值结果覆盖,最终全表应用的是最后一行的判断结果。
  • 循环遍历mcapstr时,每次操作都修改整个DataFrame的列,没有针对行索引做精准赋值,这是Pandas循环操作的典型误区。

解决方法

方法1:向量化操作(推荐,高效)

Pandas的核心优势是向量化运算,无需循环即可批量处理数据,效率远高于逐行循环。

基础版:仅识别USD

import numpy as np

# 批量判断并赋值
df_currency["Currency_Name"] = np.where(df_currency["Amount"].str.contains(r"\$"), "USD", "Other")
df_currency["FX"] = np.where(df_currency["Amount"].str.contains(r"\$"), 1, "TBD")
  • df_currency["Amount"].str.contains(r"\$"):向量化检查每行是否包含$,返回布尔型Series
  • np.where(条件, 满足值, 不满足值):根据条件批量给列赋值

扩展版:识别多种货币

如果需要识别更多货币后缀(如MYR、CNY),可以自定义函数后用apply批量处理:

def get_currency_info(amount_str):
    if "$" in amount_str:
        return "USD", 1
    elif "MYR" in amount_str:
        return "MYR", 4.7  # 示例汇率,可根据实际调整
    elif "CNY" in amount_str:
        return "CNY", 7.2
    else:
        return "Other", "TBD"

# 批量获取货币信息并拆分到两列
df_currency[["Currency_Name", "FX"]] = df_currency["Amount"].apply(
    lambda x: pd.Series(get_currency_info(x))
)

方法2:修正循环逻辑(仅作理解用)

如果一定要用循环,需针对行索引精准修改对应值,避免覆盖整列:

USD = "$"
# 先初始化列的默认值
df_currency["Currency_Name"] = "Other"
df_currency["FX"] = "TBD"

# 遍历索引与对应金额字符串
for idx, wordcheck in enumerate(mcapstr):
    if USD in wordcheck:
        df_currency.loc[idx, "Currency_Name"] = "USD"
        df_currency.loc[idx, "FX"] = 1
  • 先给整列设置默认值,再通过df.loc[idx, 列名]修改指定行的对应值,避免覆盖之前的行数据
  • 用enumerate获取行索引,确保修改的是当前循环对应的行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:54:58