Pandas函数可单独作用于列但无法作用于整个DataFrame的问题求助
问题分析与解决
问题重现
示例DataFrame代码:
import pandas as pd import datetime as dt df = pd.DataFrame({'smiles': ['CCCCC', 'CCCC1', 'CCCN1'], 'ID' : ['A-111', 'A112', 'A-113'], 'Parameter_1':[30.0, 31.4, 15.9], 'Parameter_2':[pd.NA, '0.644', '4.38E-02'], 'Date': [dt.date(2021, 1, 1), dt.date(2021, 1, 2), dt.date(2021, 1, 3)]})
自定义数值转换函数:
def num_parse(element): try: float(element) return float(element) except ValueError: return(element) except TypeError: return(element)
对单个列应用函数时运行正常:
df['Parameter_1'] = df['Parameter_1'].apply(num_parse)
但对整个DataFrame应用时触发报错:
df = df.apply(num_parse)
报错信息:
TypeError: cannot convert the series to <class 'float'>
报错原因
df.apply()默认按列(axis=0)传递数据,此时传入num_parse的是整列的Series对象,而float()无法直接将Series转为浮点数,因此抛出类型错误。
而Series.apply()是逐元素传递值给函数,所以能正常处理每个单独的元素。
解决方法
要对整个DataFrame的每个元素应用函数,使用df.applymap()方法,它会逐元素遍历整个DataFrame,将每个元素单独传入函数处理:
df = df.applymap(num_parse)
处理后效果:
Parameter_2列的'0.644'和'4.38E-02'会被转为浮点数0.644和0.0438smiles、ID列的字符串保持原样Date列的日期对象不受影响- 缺失值(NaN/pd.NA)会被保留(因为转换时触发TypeError,函数返回原元素)
内容的提问来源于stack exchange,提问作者Stuchfield
相关产品推荐
相关产品推荐

