【问题标题】:Ignore extraneous commas when using pandas.read_csv使用 pandas.read_csv 时忽略多余的逗号
【发布时间】:2016-12-30 23:46:47
【问题描述】:

我正在使用一个开放数据集,该数据集记录 1999 年至 2015 年的学校入学情况。但是,该数据集在 CSV 中为未来几年预先分配了列,即使这些列是空的。

数据可以在http://www.gov.pe.ca/opendata/OD9%20Offical%20School%20Enrollments%201999%20-2015.csv查看

这是我的代码:

#Read current open data set (OD34) from URL and store in an array called enrollment
url = "http://www.gov.pe.ca/opendata/OD9%20Offical%20School%20Enrollments%201999%20-2015.csv?"
col_names = ['School_Name','1999','2000','2001','2002','2003','2004','2005','2006','2007','2008','2009','2010','2011','2012','2013','2014','2015']
enrollment = pandas.read_csv(url, header=None, skiprows=1, names=col_names, nrows=2)
print(enrollment)
print(enrollment.shape)
print(type(enrollment))

代码确实会转值,但过多的逗号意味着每所学校都有几十个 NaN 值。 DataFrame 确实显示为 2,18 数组,但 print(enrollment) 显示的是 NaN 值。

编辑:我在 pandas.read_csv 语句中添加了na_filter=False,当我print(enrollment) 时,无关的 NaN 值消失了,但看起来每一列(一年)都有所有数据,而不是对齐每年的入学人数.

这是一个数据示例。

School Name,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Alberton Elementary School,229,231,237,213,225,218,219,214,194,186,167,175,178,158,148,129,127,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

【问题讨论】:

  • dropna DataFrame 方法是您要找的吗?
  • 我绝对可以使用 dropna 在导入后删除 NA。查看我的编辑,我使用 'na_filter=False' 来获得相同的结果。
  • enrollment.dropna(axis=1)
  • 再说一次,你的问题是什么?
  • @piRSquared 起初我试图弄清楚如何排除无关的 NaN 值(这似乎可以使用 na_filter=False 解决)但现在我试图确保每列的值都是被正确解析。鉴于我在“打印(注册)”时看到的结果,我似乎并非如此,但因为今天是我第一次尝试使用 Pandas,而上周是我第一次尝试使用 Python,我并不完全是一定要诚实。

标签: python csv pandas


【解决方案1】:

我会这样解析它:

pandas.read_csv(url, index_col=0).filter(regex='\d{4}')

看起来像这样


它在做什么

  • index_col=0 告诉 pandas 第一列是索引。这似乎是合理的,在查看结果后,感觉是对的。
  • 默认情况下,read_csv 将假定存在标题行。让它吧。
  • filter(regex='\d{4}') 只会传递带有四位数标题的列。

因此,请确保将其分配给所需的数据框变量。

enrollment = pandas.read_csv(url, index_col=0).filter(regex='\d{4}')

【讨论】:

  • 太棒了! .filter(regex='\d{4}') 正是我在解决方案中寻找的。谢谢!不幸的是,我的投票没有足够的声誉,但我确实对你的答案投了赞成票。
  • @jbiggley 不用担心。新年快乐!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2020-02-21
相关资源
最近更新 更多