pandas CSV 文件读取不会将数据类型从 object 转换为 int

Posted

技术标签:

【中文标题】pandas CSV 文件读取不会将数据类型从 object 转换为 int【英文标题】:pandas CSV file read won't convert data types from object to int 【发布时间】:2020-09-14 14:31:17 【问题描述】:

由于绘制数据时出现错误(使用 plt plot),我正在尝试将通过 CSV 文件导入的数据转换为 float 或 int 类型。我已经尝试了我在网上看到的几乎所有东西,pd.to_numeric,.astype(),创建要转换的函数,每次我收到代码无法将字符串转换为浮点数的错误。到目前为止,我所有的 dtypes 都是对象,甚至是数字的。以下是我的代码:

    apo2data = pd.read_csv('/Users/lily/Desktop/Apo2excel.csv')
    type(apo2data)
    apo2data.dtypes
    data = apo2data.apply(pd.to_numeric, errors='coerce').fillna(" ")
    data.info()
    data.head()


    Out[:] <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 6676 entries, 0 to 6675
    Data columns (total 38 columns):
    #   Column       Non-Null Count  Dtype 
   ---  ------       --------------  ----- 
   0   KIC          6676 non-null   object
   1   2MASS        6676 non-null   object
   2   Teff         6676 non-null   object
   3   e_Teff       6676 non-null   object
   4   FeH          6676 non-null   object
   5   e_FeH        6676 non-null   object
   ...
   dtypes: object(38)
   memory usage: 1.9+ MB

【问题讨论】:

【参考方案1】:

问题是fillna(' ')。通过这样做,您将拥有具有混合类型值的列。在 Pandas 中,混合类型的值始终为 object 类型。你可以删除fillna,你会得到float64 dtypes:

data = apo2data.apply(pd.to_numeric, errors='coerce')

【讨论】:

【参考方案2】:

你可能想使用'dtype'参数来设置正确的类型,你可以在https://honingds.com/blog/pandas-read_csv/找到一个例子

【讨论】:

【参考方案3】:

我认为你有对象,因为你强制转换 to_numeric,所以字符串被转换为NaN,然后你用" " 填充NaN。如果您确定所有列都应转换为数字类型,我建议您进行一些预处理:

df = pd.DataFrame('col1':list('12345'),
                   'col2':['green','blue','red','yellow','pink'],
                   'col3':['1 green','2 blue','3 red','4 yellow','5 pink'])
df['col3'] = df.col3.apply(lambda x: x.split()[0]).astype(int)   

【讨论】:

以上是关于pandas CSV 文件读取不会将数据类型从 object 转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 高效读取大型 CSV 文件而不会崩溃

将文件从私有 S3 存储桶读取到 pandas 数据帧

使用 pandas 读取 csv 时设置列类型

Pandas从入门到实战(day1)

如何在streamlit中从用户读取csv文件并转换为pandas数据框

从 Google Cloud 存储读取 csv 到 pandas 数据框