如何对字典中的DataFrame应用自定义函数完成百分比列转浮点型
现有代码的问题
- 没有对
apply的返回值赋值:Pandas中绝大多数操作默认返回新对象而非修改原数据,你调用data[key].apply(...)后没有把结果赋值回原位置,所以原DataFrame没有任何变化。 - 函数内的判断逻辑错误:
if '%' in x中的x是整列Series,in操作符对Series判断的是「索引是否包含该值」而非「元素内容是否包含该字符」,逻辑完全不成立。 - 未限定处理的指定列:你当前是对DataFrame所有列执行转换,会导致不需要处理的文本列也被传入函数,和你「仅转换指定列」的需求不符。
最简实现方案
你不需要单独写转换函数,直接用str.replace配合pd.to_numeric即可实现兼容带%/不带%的字符串转浮点的需求,示例代码如下:
import pandas as pd data = {'dataframe_1':pd.DataFrame({'col1': ['John', 'Ashley'], 'col2': ['+10', '-1']}), 'dataframe_2':pd.DataFrame({'col3': ['Italy', 'Brazil', 'Japan'], 'col4': ['Milan', 'Rio do Jaineiro', 'Tokio'], 'percentage':['95%', '0%', '80%']})} # 定义每个DataFrame需要转换的列,可根据实际需求修改 target_cols = { 'dataframe_1': ['col2'], 'dataframe_2': ['percentage'] } for df_name, cols in target_cols.items(): df = data[df_name] for col in cols: # 先判断该列是否包含%符号 has_percent = df[col].str.contains('%', na=False).any() # 去掉%符号后转浮点 df[col] = pd.to_numeric(df[col].str.replace('%', '', regex=False), errors='coerce') # 包含%的列数值自动除以100 if has_percent: df[col] = df[col] / 100 data[df_name] = df
执行后data['dataframe_2']的输出如下,完全符合预期:
col3 col4 percentage 0 Italy Milan 0.95 1 Brazil Rio do Jaineiro 0.00 2 Japan Tokio 0.80
如果不需要自动区分是否要除以100,仅需要把指定列的%去掉转浮点,删除has_percent相关的判断分支即可。
内容的提问来源于stack exchange,提问作者AlSub
相关产品推荐
相关产品推荐

