使用pandas读取具有可变数量列的csv

问题描述 投票:0回答:1

我有一个csv文件,列数可变。

Pandas可以使用name参数轻松处理这种情况。如果文件的第一行与names的长度相同或更短,则此方法有效,但如果更长则失败。

例子

Case 1

第一行与names具有相同数量的元素

from io import StringIO
import pandas as pd

file = StringIO(
        '''1, 2, 3,
           1, 2
           1, 2, 3, 4, 
           1, 2, 3,''')

df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df

# Out[0]:
#    A  B    C
# 0  1  2  3.0
# 1  1  2  NaN
# 2  1  2  3.0
# 3  1  2  3.0

这有效。

Case 2

第一行的元素少于names

from io import StringIO
import pandas as pd

file = StringIO(
        '''1, 2,
           1, 2
           1, 2, 3, 4, 
           1, 2, 3,''')

df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df

# Out[0]:
#    A  B    C
# 0  1  2  NaN
# 1  1  2  NaN
# 2  1  2  3.0
# 3  1  2  3.0

这也有效。

Case 3

第一行比names有更多的元素

from io import StringIO
import pandas as pd

file = StringIO(
        '''1, 2, 3, 4,
           1, 2
           1, 2, 3, 4, 
           1, 2, 3,''')

df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df

# Expected output:
#    A  B    C
# 0  1  2  3.0
# 1  1  2  NaN
# 2  1  2  3.0
# 3  1  2  3.0
#
# Instead I get:
# IndexError: list index out of range

这不起作用!

Question

有没有办法使这个脚本更健壮,以便它也处理案例3而不会产生错误?这看起来有点像臭虫吗?

我正在运行pandas版本0.23.4

编辑:

Case 3b

第一行比names有更多的元素

from io import StringIO
import pandas as pd

file = StringIO(
        '''1, 2, 3, 4
           1, 2
           1, 2, 3, 4, 
           1, 2, 3,''') # NOTE: No comma after the first "4"!!

df = pd.read_csv(file, names=['A','B','C'], index_col=False)
df

#Out[0]:
#    A  B    C
# 0  1  2  3.0
# 1  1  2  NaN
# 2  1  2  3.0
# 3  1  2  3.0

这个工作!!!

这到底是怎么回事?

python pandas
1个回答
2
投票

只需使用usecols params,而不是namesnames假设您列出了所有列的名称,而usecolsa则是列的子样本。

from io import StringIO
import pandas as pd

file = StringIO(
        '''1, 2, 3, 4,
           1, 2
           1, 2, 3, 4, 
           1, 2, 3,''')

df = pd.read_csv(file, usecols =[0,1,2], header = None)
df
0   1   2
0   1   2   3.0
1   1   2   NaN
2   1   2   3.0
3   1   2   3.0
© www.soinside.com 2019 - 2024. All rights reserved.