熊猫read_csv usecols和名称无法正常工作

时间:2019-08-01 09:36:05

标签: python pandas

我正在读取没有标题的熊猫csv文件。我的问题是,当我在usecols中硬编码值并命名时,它工作正常。但是,当我从cols和名称列表中获取输入作为json文件的输入时,列名和行不匹配。长期以来,我确实对这个问题感到震惊。

//这不起作用。

temp = pd.read_csv(file_name, header=None ,skiprows=[0], engine='python', sep=' |,', usecols = cols, names= names)  

//但这可行

temp = pd.read_csv(file_name, header=None ,skiprows=[0], engine='python', sep=' |,', usecols = [10,12,14], names= ['a', 'b', 'c'])

考虑此csv:X-Y-Z,12.67,印度, A-X-o,11.43,中国, D-F-L,6.09,肯尼亚

现在运行此代码

cols = [2,3,1] 名称= ['价格','国家','代码']

temp = pd.read_csv('test.csv',header = None,skiprows = [0],engine ='python',sep ='|,',usecols = cols,names = names)

产生...

价格国家代码 0 A-X-o 11.43中国 1 D-F-L 6.09肯尼亚

这是错误的,因为国家/地区不是小数位

2 个答案:

答案 0 :(得分:1)

import pandas as pd
fields = ['a', 'b','c']
#always use `skipinitialspace` which remove the spaces in the header for reading specific columns
df = pd.read_csv('data.csv', skipinitialspace=True, usecols=fields)

编辑:

您用错误的方式使用了usecols,因为[2,3,1][1,2,3]都是一样的,所以不会更改顺序,重要的是如何指定names

import pandas as pd   

df = {'letters': ['X-Y-Z','A-X-o','D-F-L'],
    'num': [12.67,11.43,6.09],
    'Country':['India','China','Kenya']}

df = pd.DataFrame(df)
df.to_csv('df.csv', header=False)

让我们考虑一些情况

#this is what you have done
cols = [2,3,1]
names = ['price','country','code']
temp = pd.read_csv('df.csv', header=None ,skiprows=[0], engine='python', sep=',',usecols = cols, names= names)

输出

        price   country code
   1    A-X-o   11.43   China
   2    D-F-L   6.09    Kenya

让cols更改为[1,2,3],并且输出将保持不变

cols = [1,2,3]
names = ['price','country','code']
temp = pd.read_csv('df.csv', header=None ,skiprows=[0], engine='python', sep=',',usecols = cols, names= names)

输出

        price   country code
   1    A-X-o   11.43   China
   2    D-F-L   6.09    Kenya

现在,将cols更改为[2,3,1][1,2,3],将names更改为['code','price','country']

cols = [2,3,1]
names = ['code','price','country']
temp = pd.read_csv('df.csv', header=None ,skiprows=[0], engine='python', sep=',', usecols = cols, names= names)

输出

    code    price   country
0   A-X-o   11.43   China
1   D-F-L   6.09    Kenya   

因此,基本上只是将cols切换为[2,3,1]并相应地将其名称指定为['price','country','code']不会给您带来不同的结果,因为usecols[2,3,1] = = usecols[1,2,3]

答案 1 :(得分:0)

仅使用文件名及其有效位置docs

temp = pd.read_csv(file_name,usecols= ['a', 'b', 'c'])

在另一方面,您可以拉出所有列的csv文件,并删除未使用的列,如下所示

temp=pd.read_csv(file_name)

temp.drop(['col1','col2'...'coln'], axis=1, inplace=True)