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"\$"):向量化检查每行是否包含$,返回布尔型Seriesnp.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
相关产品推荐
相关产品推荐

