我有一个具有可变列数的csv文件。
使用name
参数,熊猫可以非常轻松地处理这种情况。如果文件的第一行的长度等于或短于names
,这将起作用,但是如果文件的第一行更长,则失败。
第一行与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
此有效。
第一行的元素少于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
这也有效。
第一行的元素比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
此无效!
是否有办法使此脚本更健壮,以便它还能处理情况3而不会产生错误? 这看起来不像是虫子吗?
我正在运行pandas版本0.23.4
第一行的元素比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
此有效!
到底是怎么回事?
答案 0 :(得分:2)
只需使用usecols
参数,而不要使用names
参数。 names
假设您要列出所有列的名称,而usecols
假定列的一个子样本。
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