【问题标题】:Change data types in Pandas dataframe更改 Pandas 数据框中的数据类型
【发布时间】:2023-01-21 23:12:56
【问题描述】:

我有一个看起来像这样的 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”。

如何将数据类型从“对象”更改为数值?

我试过这个 pd.to_numeric(df['column2'][0]) 但它没有用。

【问题讨论】:

  • 预期的输出到底是什么?你只想要第一个数字吗?全部?
  • 我想拥有所有数字

标签: python pandas


【解决方案1】:

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 模块:

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

【讨论】:

    【解决方案2】:

    一种选择是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-25
      • 2021-02-20
      • 1970-01-01
      • 2019-04-17
      • 2021-11-02
      • 2018-01-09
      • 2020-05-12
      • 2020-07-24
      相关资源
      最近更新 更多