更改Pandas数据框架中的数据类型



我有一个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])但是没有成功。

evalast.literal_eval将不起作用,因为字符串NaN在没有上下文的Python中并不意味着任何东西(因为它是np.nan-但模块ast不知道这一点)

因此,您可以将NaNs更改为None,然后应用ast.literal_evaleval,然后将Nones转换为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

相关内容

最新更新