我有一个csv文件,看起来像这样:
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说"column2"是一个对象,因此如果我打印df['column2'][0][0],我得到的是'('而不是"0.2"
如何将数据类型从"object"到数值?
我试过了pd.to_numeric(df['column2'][0])
但是没有成功。
eval
和ast.literal_eval
将不起作用,因为字符串NaN
在没有上下文的Python中并不意味着任何东西(因为它是np.nan
-但模块ast
不知道这一点)
因此,您可以将NaN
s更改为None
,然后应用ast.literal_eval
或eval
,然后将None
s转换为np.nan
:
import ast
df['column2'] = df['column2'].str.replace('NaN', 'None').apply(ast.literal_eval).apply(lambda x: tuple(np.nan if val is None else val for val in x))
和
df['column2'] = df['column2'].str.replace('NaN', 'None').apply(eval).apply(lambda x: tuple(np.nan if val is None else val for val in x))
较短的版本将NaN
替换为np.nan
,并为其提供Numpy模块:
import numpy as np
df['column2']=df['column2'].str.replace('NaN', 'np.nan').apply(eval)
如果您不想使用ast
模块。
In [98]: df['column2'][0][0]
Out[98]: 0.2
In [100]: type(df['column2'][0])
Out[100]: tuple
一个选项可以是split
的值:
df2 = df['column2'].str.strip('()').str.split(',s*', expand=True).astype(float)
输出:
0 1 2
0 0.2 0.02 NaN
1 0.0 0.03 0.0
2 0.1 NaN 1.0