如何将Pandas DataFrame中列的对象类型转换为数值类型?
问题描述
我有如下格式的CSV文件,构造的Pandas DataFrame如下:
table = {'column1': [1,2,3], 'column2': ['(0.2, 0.02, NaN)','(0.0, 0.03, 0)','(0.1, NaN, 1)']} df = pd.DataFrame(table)
我想要访问column2中存储的数组,但Pandas显示该列类型为object,打印df['column2'][0][0]得到的是'('而非0.2。尝试使用pd.to_numeric(df['column2'][0])也未成功,请问如何将该列的数据类型从object转换为数值类型?
解决方案
方法1:字符串处理+拆分转换
先清理字符串中的括号,按逗号拆分后转换为数值数组:import pandas as pd import numpy as np # 去除首尾括号并按逗号+空格拆分字符串 df['column2'] = df['column2'].str.strip('()').str.split(', ') # 将每个子列表转为带NaN的数值数组 df['column2'] = df['column2'].apply(lambda x: np.array(pd.to_numeric(x, errors='coerce')))处理后
df['column2'][0][0]将返回0.2,所有元素均为数值类型,原字符串中的NaN会被正确识别为缺失值。方法2:用
ast.literal_eval解析(需处理NaN)
利用Python的抽象语法树解析字符串为原生对象,注意先替换字符串中的NaN为可解析的格式:import pandas as pd import ast import numpy as np # 替换字符串里的NaN为numpy的NaN标识,再解析为元组 df['column2'] = df['column2'].str.replace('NaN', 'np.nan').apply(ast.literal_eval) # 转换为数值数组 df['column2'] = df['column2'].apply(np.array)此方法更贴近原生数据结构解析,但要保证字符串中
NaN的格式统一,避免解析报错。方法3:拆分为独立数值列(无需保留数组)
如果不需要保留数组形式,直接拆分出多列数值:import pandas as pd # 拆分字符串并展开为多列 expanded_cols = df['column2'].str.strip('()').str.split(', ', expand=True) # 批量转换为数值类型 expanded_cols = expanded_cols.apply(pd.to_numeric, errors='coerce') # 重命名列并和原DataFrame合并 df = pd.concat([df['column1'], expanded_cols.rename(columns={0:'col2_val1', 1:'col2_val2', 2:'col2_val3'})], axis=1)拆分后可直接操作独立的数值列,更适合后续数据分析场景。
内容的提问来源于stack exchange,提问作者Cruz
相关产品推荐
相关产品推荐

