Обрабатывать неизвестное количество столбцов при чтении панд CSV - PullRequest
0 голосов
/ 03 октября 2019

Я получил данные от stdin как

x
x
x    y
x
x    y    z
...

, и я хочу создать pandas DataFrame на основе этого ввода

df = pd.read_csv(sys.stdin, sep='\t', header=None)

, но проблема в том, что мойданные в третьей строке имеют больше значений, чем первая, и я получил

pandas.errors.ParserError: Ошибка токенизации данных. Ошибка C: Ожидается 1 поле в строке 3, пила 2

Вопросы: как мне справиться с этой ошибкой, когда я не знаю цепочку самых длинных элементов (разделенных \t).

1 Ответ

1 голос
/ 03 октября 2019

Вся задача может быть выполнена в инструкции single , без подсчета элементов в каждой строке.

Я подготовил такой пример чтения из строки, используя io.StringIO :

df = pd.DataFrame([ ln.rstrip().split('\t') for ln in
    io.StringIO(txt).readlines() ]).fillna('')

Понимание списка преобразует каждую строку источника в список фрагментов (между Tab s).

Тогда это понимание списка data параметр pd.DataFrame и обратите внимание, что такой список строк может содержать строки различной длины.

Я также добавил fillna ('') для преобразования каждого NaN в пустую строку (вы можете удалить ее, если хотите).

Чтобы запустить тест, я определил исходную переменную как:

txt = '''x
x
x   y
x
x   y   z
x
x   y   z   v'''

end выполнил вышеуказанный код, получив:

   0  1  2  3
0  x         
1  x         
2  x  y      
3  x         
4  x  y  z   
5  x         
6  x  y  z  v

В целевой версии замените чтение из строки на чтение из stdin .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...