【问题标题】:Trying to keep the same type after saving a dataframe in a csv file将数据框保存在 csv 文件中后尝试保持相同的类型
【发布时间】:2020-09-19 13:08:51
【问题描述】:

当我尝试从 csv 文件中取出我的数据框时,数据的类型发生了变化。有什么办法可以避免这种情况吗?

【问题讨论】:

    标签: python python-3.x dataframe


    【解决方案1】:

    如果您在单行中添加带有错误数据的记录,如果在加载时被解释为正确的数据类型,那么您可以使用 .csv。例如,在需要作为对象的字段中添加通用字符串,否则会加载为整数或浮点数。

    【讨论】:

      【解决方案2】:

      csv 文件没有数据类型定义标题或类似的东西。 因此,当您阅读 csv pandas 时会尝试猜测类型,这可能会更改数据类型。 您有两种可能的解决方案:

      1. 使用 dtype 和 parse_dates 关键字执行 read_csv 时提供数据类型列表 (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)
      2. 使用不同的文件格式来存储具有架构的数据(例如镶木地板)

      例如:

      import pandas as pd
      date = pd.to_datetime('01-01-2020')
      
      df=pd.DataFrame({'col1':[1,2,3,4],'col2':['a','b','b','d'],'col3':[date,date,date,date]})
      
      print('original \n',df.dtypes)
      
      df.to_csv('testtype.csv',index=False)
      df_csv = pd.read_csv('testtype.csv')
      print('simple csv read \n',df_csv.dtypes)
      
      df_csv = pd.read_csv('testtype.csv')
      print('csv datatypes \n',df_csv.dtypes)
      
      df_csv = pd.read_csv('testtype.csv',parse_dates=[2])
      print('csv with parse dates \n',df_csv.dtypes)
      
      df.to_parquet('testtype.pqt')
      df_pqt=pd.read_parquet('testtype.pqt')
      
      print('parquet  \n',df_pqt.dtypes)
      

      那个输出:

      original 
       col1             int64
      col2            object
      col3    datetime64[ns]
      dtype: object
      
      simple csv read 
       col1     int64
      col2    object
      col3    object
      dtype: object
      
      csv datatypes 
       col1     int64
      col2    object
      col3    object
      dtype: object
      
      csv with parse dates 
       col1             int64
      col2            object
      col3    datetime64[ns]
      dtype: object
      
      parquet  
       col1             int64
      col2            object
      col3    datetime64[ns]
      dtype: object
      

      【讨论】:

      • 非常感谢,这真的很有帮助。我确实从 parquet 'ArrowInvalid: ("Could not convert GPX', I don't know if this is compatible with gpx data?@riccardonizzolo
      • 我不知道 GPX 数据,也许你应该就这个主题发表另一个问题。如果您最初的问题得到解决,请接受答案
      【解决方案3】:

      CSV 是文本文件,因此本身不包含像数据类型这样的元数据。

      当您打开已保存的 CSV 时,Python/Pandas 正在解释它认为的数据类型 - 与您想要的相比,它可能有点错误(这是正在发生的事情,而不是您的 CSV 被保存错误的数据类型)。

      Pandas 'read_csv' 有一个 'dtype' 参数,它将采用列类型的字典。这应该让您指定您想要的数据类型。 I'd suggest reading through the function documentation here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-11
        • 2020-03-29
        • 1970-01-01
        • 2022-06-28
        • 1970-01-01
        • 2021-02-12
        • 2020-01-09
        • 1970-01-01
        相关资源
        最近更新 更多