#python #pandas
#python #pandas
Вопрос:
У меня есть CSV-файл с переменным количеством столбцов.
Pandas может довольно легко справиться с ситуацией с помощью name
параметра. Это работает, если первая строка файла имеет ту же длину или короче names
, но завершается неудачей, если она длиннее.
Примеры
Пример 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
Это работает.
Случай 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
Это тоже работает.
Пример 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
Это не работает !!!
Вопрос
Есть ли способ сделать этот скрипт более надежным, чтобы он обрабатывал также случай 3 без генерации ошибки? Разве это немного не похоже на ошибку
Я использую pandas версии 0.23.4
Редактировать:
Пример 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
Это работает!!!
Что, черт возьми, происходит?
Ответ №1:
Просто используйте 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