【问题标题】:Pandas read_csv suddenly reads in int as object and I can't change itPandas read_csv 突然将 int 作为对象读取,我无法更改它
【发布时间】:2021-08-11 13:29:10
【问题描述】:

我正在使用 pandas 使用命令读取 .dat 文件

'recoil = pd.read_csv('partic_tran_r.dat', engine='python', skiprows=9, sep='\s+')

当我使用 'recoil.dtypes' 询问数据类型时,我得到以下信息:

pid              object
projectile       object
species          object
gen              object
collision        object
medium          float64
huge            float64
fluence         float64
...
...
dtype: object

因此,大多数数据类型都被正确识别,但前五个似乎突然不正确了。 当我尝试将dtype=int 修改为read_csv() 中的参数时,我只会收到错误消息ValueError: Unable to convert column pid to type <class 'int'>

我以前没有这个问题,我不知道现在与以前相比有什么不同。 我将其设置为 int 或 float 的用例是我想创建一个唯一的 id:

projectile['unique_id'] = projectile['pid'] + projectile['projectile'] * 10

它返回pid=3patricle=74unique_id=374(74 repeated 10 times),虽然我之前没有遇到这个问题,并且代码运行没有问题。

感谢您提供有关如何解决或规避此问题的任何建议。 附言我正在 Windows10 上 Anaconda 中最新版本的 JupyterLab 中编写我的代码,所有这些都更新为 conda update --all

【问题讨论】:

  • 分享 csv,以便我们了解pid 可能出现的问题
  • 是的,这很好。由于@Corralien 的回答,我已经发现了错误,即这个 .dat 文件中有一个页脚,我不知道它在那里,我忘了看最明显的地方,只看了“射弹” .head()´
  • 你有没有试过在你读完之后改变它。也许像这样recoil['pid'] = recoil.pid.astype('int32')
  • 嘿@j__carlson,是的,我有,但没有奏效,不幸的是,Corralien 在我回复的地方删除了他的答案。答案是在新的 .dat 文件版本中,有一个仅影响第一列的页脚,因为底部有文本。通过在“read_csv”中设置页脚参数来删除它们或对其进行说明是有效的。所以这是我过于关注“x.head()”而不是整个数据集的问题。

标签: python pandas dtype


【解决方案1】:

好的,出于完整性考虑,我想将答案作为答案发布,而不仅仅是在 cmets 中:

我没有仔细查看 .dat 文件,该文件末尾有两个字符串,与旧版本相比,这些字符串在 .dat 中是新的。 所以只需在pd.read_csv()footer 参数中考虑它或删除它们自然解决了将整个列转换为对象而不是int64 的问题。

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2019-07-22
    • 2013-10-27
    • 2017-09-26
    • 2017-07-21
    相关资源
    最近更新 更多