Подтвердить что ты не робот

Обработка переменной числа столбцов с помощью Pandas - Python

У меня есть набор данных, который выглядит так (не более 5 столбцов, но может быть меньше)

1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4
....

Я пытаюсь использовать pandas read_table, чтобы прочитать это в кадре данных с пятью столбцами. Я бы хотел прочитать это без дополнительного массажа.

Если я попробую

import pandas as pd
my_cols=['A','B','C','D','E']
my_df=pd.read_table(path,sep=',',header=None,names=my_cols)

Я получаю сообщение об ошибке - "имена столбцов имеют 5 полей, данные имеют 3 поля".

Есть ли способ сделать pandas заполнить NaN для отсутствующих столбцов при чтении данных?

4b9b3361

Ответ 1

Один из способов работы (по крайней мере, в 0.10.1 и 0.11.0.dev-fc8de6d):

>>> !cat ragged.csv
1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4
>>> my_cols = ["A", "B", "C", "D", "E"]
>>> pd.read_csv("ragged.csv", names=my_cols, engine='python')
   A  B   C   D   E
0  1  2   3 NaN NaN
1  1  2   3   4 NaN
2  1  2   3   4   5
3  1  2 NaN NaN NaN
4  1  2   3   4 NaN

Обратите внимание, что этот подход требует, чтобы вы указывали имена столбцам, которые вы хотите. Не как общий, как некоторые другие способы, но работает достаточно хорошо, когда он применяется.

Ответ 2

Мне также было бы интересно узнать, возможно ли это, из документа это, похоже, не так. То, что вы, вероятно, могли бы сделать, это прочитать файл по строкам и объединить каждое чтение в DataFrame:

import pandas as pd

df = pd.DataFrame()

with open(filepath, 'r') as f:
    for line in f:
        df = pd.concat( [df, pd.DataFrame([tuple(line.strip().split(','))])], ignore_index=True )

Это работает, но не самым элегантным способом, я думаю...

Ответ 3

Ok. Не уверен, насколько это эффективно, но вот что я сделал. Хотелось бы услышать, есть ли лучший способ сделать это. Спасибо!

from pandas import DataFrame

list_of_dicts=[]
labels=['A','B','C','D','E']
for line in file:
    line=line.rstrip('\n')
    list_of_dicts.append(dict(zip(labels,line.split(','))))
frame=DataFrame(list_of_dicts)