【问题标题】:pandas.read_csv() strange behavior for empty (default) valuespandas.read_csv() 空(默认)值的奇怪行为
【发布时间】:2012-12-23 15:35:28
【问题描述】:

我有以下输入 trans.csv 文件:

Date,Currenncy,Symbol,Type,Units,UnitPrice,Cost,Tax
2012-03-14,USD,AAPL,BUY,1000
2012-05-12,USD,SBUX,SELL,500

UnitPrice、Cost 和 Tax 字段是可选的。如果未指定它们,我希望 DataFrame 单元格中出现 NaN。

我读取了 csv 文件:

t = pandas.read_csv('trans.csv', parse_dates=True, index_col=0)

得到如下结果:

           Currenncy Symbol  Type  Units   UnitPrice       Cost       Tax
Date                                                                     
2012-03-14       USD   AAPL   BUY   1000  2012-05-12  012-05-12  12-05-12
2012-02-05       USD   SBUX  SELL    500         NaN        NaN       NaN

为什么第一行没有 NaN 并且 Date 重复了? 为未指定的字段获取 NaN 的任何解决方法?

【问题讨论】:

  • 将此添加为issue on github。我发布的答案现在应该修复它(当某些列中有数据时它会捕获)......

标签: python csv pandas


【解决方案1】:

您的 CSV 文件格式不正确。我在 Pandas 0.10 中得到了和你一样的答案,虽然我承认这确实非常非常奇怪,但你不应该向它提供格式错误的数据。

Date,Currenncy,Symbol,Type,Units,UnitPrice,Cost,Tax
2012-03-14,USD,AAPL,BUY,1000,,,
2012-05-12,USD,SBUX,SELL,500,,,

返回预期的

>>> import pandas as pd
>>> t = pd.read_csv('pandas_test', parse_dates=True, index_col=0)
>>> t
           Currenncy Symbol  Type  Units  UnitPrice  Cost  Tax
Date                                                          
2012-03-14       USD   AAPL   BUY   1000        NaN   NaN  NaN
2012-05-12       USD   SBUX  SELL    500        NaN   NaN  NaN

【讨论】:

  • 一个逗号太多了,现在有 NaN 单位,没有错误信息!熊猫可以不将多余的逗号设为可选吗?看起来更干净。
  • “看起来更干净”。为什么要在解析原始数据时关心它的样子?如果它不正确,它看起来更干净并不重要。
  • @hayden,确实提供格式错误的数据就是生命。我们不能期望熊猫能优雅地处理这件事吗?它没有那么畸形。
  • @rdw 我想是的。它看起来像一个错误。
  • “格式错误”。畸形是二元的,要么是畸形的要么不是畸形的。
【解决方案2】:

这是一种可以处理更多情况的方法(当UnitCostCost等有一些数据时)。

In [1]: df = pd.read_csv('trans.csv', header=None)

In [2]: df.columns = df.ix[0]

In [3]: df[1:].set_index('Date')
Out[3]: 
           Currenncy Symbol  Type Units UnitPrice Cost  Tax
Date                                                       
2012-03-14       USD   AAPL   BUY  1000       NaN  NaN  NaN
2012-05-12       USD   SBUX  SELL   500       NaN  NaN  NaN
2012-05-12       USD   SBUX  SELL   500       NaN  NaN  NaN

值得注意的是,这些列的 dtype 将是object

不过,我认为这应该被to_csv 发现,所以我发布为an issue on github

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多