【问题标题】:Why is pandas data frame interpreting all data as NaN?为什么熊猫数据框将所有数据解释为 NaN?
【发布时间】:2017-12-18 15:37:37
【问题描述】:

我正在从 csv 文件导入数据以用于 pandas 数据框。我的数据文件有 102 行和 5 列,并且在 Excel 中都清楚地标记为“数字”。我的代码如下:

import pandas as pd

data = pd.read_csv('uni.csv', header=None, names = ['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])

print data.head()

输出如下:

            TopThird  Oxbridge  Russell  Other  Low
0  14\t1\t12\t35\t1       NaN      NaN    NaN  NaN
1   14\t1\t12\t32\t0       NaN      NaN    NaN  NaN
2   16\t0\t13\t33\t0       NaN      NaN    NaN  NaN
3    10\t0\t9\t44\t1       NaN      NaN    NaN  NaN
4   18\t1\t13\t28\t1       NaN      NaN    NaN  NaN

这继续到数据框的底部。我试图将 Excel 中的单元格类型更改为“常规”或在“数字”类型上使用小数点,但这并没有改变任何内容。

为什么会这样?如何预防?

【问题讨论】:

  • 因为你没有通过正确的分隔符。给read_csv添加参数delim_whitespace=True
  • 或者,作为 TSV,您可以使用 pd.read_fwf(...)
  • @cᴏʟᴅsᴘᴇᴇᴅ 谢谢,第一个有效。如果您想在其中包含一些解释,请随时发布作为答案。
  • @cᴏʟᴅsᴘᴇᴇᴅ:等等,什么?作为制表符分隔的文件,您建议首先使用所有空格作为分隔符,然后使用固定宽度格式阅读器?
  • @DSM 因为我不确定什么会起作用,所以我提供了两种选择。其中一个似乎有效。

标签: python pandas dataframe nan


【解决方案1】:

您的文件似乎是制表符分隔值的文件。您需要明确让read_csv 知道它正在处理作为分隔符的空白字符。

在大多数情况下,传递sep='\t' 应该可以。

df = pd.read_csv('uni.csv', 
                 sep='\t', 
                 header=None, 
                 names=['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])

但是,在某些情况下,列不是完全用制表符分隔的。假设你有一个 TSV 数字,使用 delim_whitespace=True 应该没问题 -

df = pd.read_csv('uni.csv', 
                 delim_whitespace=True, 
                 header=None, 
                 names=['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])  

等同于sep='\s+',更通用一点,谨慎使用。从好的方面来说,如果你的列有杂散的空白,这应该会自动处理。


正如@Vaishali 所提到的,有一个替代函数pd.read_table 对宽度TSV 文件很有用,并且可以使用您传递给read_csv 的相同参数 -

df = pd.read_table('uni.csv', header=None, names=[...])

【讨论】:

    【解决方案2】:

    看起来像制表符分隔的数据。试试sep='\t'

    data = pd.read_csv('uni.csv', sep='\t', header=None, names = ['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2018-02-08
      • 1970-01-01
      • 2015-05-10
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多