Чтение csv с переменным количеством столбцов с помощью pandas

#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