ipython pandas TypeError:read_csv()得到了一个意想不到的关键字参数' delim-whitespace''

时间:2015-01-23 01:55:21

标签: python python-2.7 pandas ipython

在尝试ipython.org笔记本时," PYTHON FOR DATA MINING"

以下代码:

data = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data-original",
               delim_whitespace = True, header=None,
               names = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration',
                        'model', 'origin', 'car_name'])

产生以下错误:

 TypeError: read_csv() got an unexpected keyword argument 'delim-whitespace'

不幸的是,数据集文件本身并不是真正的csv,我不知道为什么他们使用read_csv()来获取数据。

数据如下所示:

 14.0   8.   454.0      220.0      4354.       9.0   70.  1.    "chevrolet impala"

环境是Debian稳定的python / 2.7 w / ipython 0.13。 在这里搜索后,我意识到它很可能是版本问题, 作为参数' delim-whitespace'可能在pandas库的更高版本中,而不是APT包管理器可用的版本。

我尝试了几种解决方法,但没有成功。

  • 首先,我尝试通过构建最新的源代码来升级pandas,但我发现我最终会得到一系列其他版本的依赖项,其版本需要升级并最终会破坏环境。例如,我不得不安装Cython,然后再次报告它 APT包管理器上的版本太旧了,所以我必须重建Cython,+其他库/模块等等。

  • 然后在看了一下API后,我尝试使用其他参数: 使用分隔符=' '在调用read_csv()时引起的 它将引号内的字符串分成几列,

    ValueError: Expecting 9 columns, got 13 in row 0
    
  • 我尝试使用read_csv()参数quotechar='"',如API中所述,但同样无法识别(意外的关键字参数)

  • 最后,我尝试使用其他方式加载文件

    data = DataFrame()
    
    data.from_csv(url)
    

    我知道了,

    Out[18]: 
    <class 'pandas.core.frame.DataFrame'>
    Index: 405 entries, 15.0   8.   350.0      165.0      3693.      11.5   70.  1."buick skylark 320" to 31.0   4.   119.0      82.00      2720.      19.4   82.  1.   "chevy s-10"
    Empty DataFrame
    
    In [19]: print(data.shape)
    (0, 9)
    
  • 或者,与from_csv(),

    的w / sep参数
    In [20]: data.from_csv(url,sep=' ')
    

    产生错误,

    ValueError: Expecting 31 columns, got 35 in row 1
    In [21]: print(data.shape)
    (0, 9)
    
  • 另外,也有相同的否定结果:

    In [32]: data = DataFrame( columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration','model', 'origin', 'car_name'])
    
    In [33]: data.from_csv(url,sep=', \t')Out[33]: 
    <class 'pandas.core.frame.DataFrame'>
    Index: 405 entries, 15.0   8.   350.0      165.0      3693.      11.5   70.  1."buick skylark 320" to 31.0   4.   119.0      82.00      2720.      19.4   82.  1.   "chevy s-10"
    Empty DataFrame
    
    In [34]: data.head()
    Out[34]: 
    Empty DataFrame
    
  • 我尝试使用ipython3代替, 但它无法找到/加载matplotlib,因为我的python3没有matplotlib 系统

非常感谢任何有关此问题的帮助。

2 个答案:

答案 0 :(得分:2)

奇怪的是,delim_whitespace参数出现在方法摘要中的Pandas documentation中,但不出现在参数列表中。尝试用delimiter = r'\s+'替换它,这相当于我假设作者的意思。

CSV确实引用逗号分隔值,但它通常用于指代常规分隔文本格式。 TSV(制表符分隔值)是另一种变体;在这种情况下,它基本上是以空格分隔的值。

答案 1 :(得分:2)

您的代码使用delim_whitespace,但错误消息显示为delim-whitespace。前者存在,后者则不存在。

如果数据文件包含

 14.0   8.   454.0      220.0      4354.       9.0   70.  1.    "chevrolet impala"

并使用

定义data
data = pd.read_csv('data', delim_whitespace = True, header=None, names = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model', 'origin', 'car_name'])

然后成功解析DataFrame:

   mpg  cylinders  displacement  horsepower  weight  acceleration  model  \
0   14          8           454         220    4354             9     70   

   origin          car_name  
0       1  chevrolet impala  

所以你只需将连字符改为下划线。


请注意,指定delim_whitespace=True时,将使用纯Python解析器。在这种情况下,我认为没有必要。使用史蒂夫霍华德建议的delimiter=r'\s+'可能会表现更好。 (The source code says,&#34; C引擎在python引擎时更快     目前功能更完整&#34;,但我认为the only feature py引擎具有C引擎不是skipfooter。)