Прочитать сложный текстовый файл (включая массивы) до Python - PullRequest
0 голосов
/ 10 января 2020

У меня есть текстовый файл, в котором один из его столбцов содержит массивы - каждая строка имеет массив различного размера в качестве значения этого столбца (массив содержит строки, разделенные запятой и определяемые кавычками). Вот пример:

   Color  Count People
0   Red   2     ["Ben", "Mike"]
1  Blue   0     []
2  Yellow 3     ["Ben", "Mike", "Tom"]

Я хочу работать с этим файлом с Pandas в качестве фрейма данных. Я пробовал много способов, включая регулярные выражения, чтобы прочитать файл, но безуспешно.

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

Буду благодарен за предложения

1 Ответ

0 голосов
/ 10 января 2020

Ваш образец очень похож на отображение pandas кадра данных. Сохранение такого кадра в CSV имеет некоторые из тех же проблем, хотя, возможно, проще. Недавно я ответил на похожий случай, отличающийся тем, что списки были заменены numpy массивами.

В любом случае, давайте попробуем более простое воссоздание.

Определите словарь:

In [77]: {'Color':'Red', 'Count':2, 'People':['Ben','Mike']}                                              
Out[77]: {'Color': 'Red', 'Count': 2, 'People': ['Ben', 'Mike']}
In [78]: pd.DataFrame([_])                                                                                
Out[78]: 
  Color  Count       People
0   Red      2  [Ben, Mike]

Или с 3 строками:

In [79]: pd.DataFrame([_77,_77,_77])                                                                      
Out[79]: 
  Color  Count       People
0   Red      2  [Ben, Mike]
1   Red      2  [Ben, Mike]
2   Red      2  [Ben, Mike]

Если мы напишем это в csv:

In [80]: df = pd.DataFrame([_77,_77,_77])                                                                 
In [81]: df.to_csv('stack59675154.txt')                                                                   
In [82]: cat stack59675154.txt                                                                            
,Color,Count,People
0,Red,2,"['Ben', 'Mike']"
1,Red,2,"['Ben', 'Mike']"
2,Red,2,"['Ben', 'Mike']"

, это как ваш CSV, за исключением того, что использует разделитель запятых и заключает в кавычки списки. На самом деле сохраняется строка печати списка, str(['Ben', 'Mike']).

pandas может прочитать это:

In [83]: data = pd.read_csv('stack59675154.txt')                                                          
In [84]: data                                                                                             
Out[84]: 
   Unnamed: 0 Color  Count           People
0           0   Red      2  ['Ben', 'Mike']
1           1   Red      2  ['Ben', 'Mike']
2           2   Red      2  ['Ben', 'Mike']
In [85]: data['People'][0]                                                                                
Out[85]: "['Ben', 'Mike']"

Но столбец People на самом деле содержит строки, а не списки. К счастью, строки могут быть eval:

In [86]: eval(_)                                                                                          
Out[86]: ['Ben', 'Mike']

Есть более безопасный анализатор строк, но я не буду вдаваться в подробности.

0,Red,2,"['Ben', 'Mike']" без кавычек, читатель будет иметь проблемы, так как он будет видеть разделитель в скобках. Простой читатель numpy.genfromtxt может даже обрабатывать эти цитаты. Простые читатели просто используют line_list = line.split(delimiter), получая список строк, по одной для каждого «столбца».

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

...