Чтение списка списков из столбца файла excel и сохранение его в списке python
Я знаю, что некоторые части этого вопроса могут быть простыми, но я новичок в этом и действительно оценил бы самое простое возможное решение: у меня есть excel (.xlsx файл), где один из его столбцов имеет свои ячейки, каждая из которых имеет список списков чисел (с числами, разделенными пробелом, и даже есть пробел в конце каждого списка). Итак, колонка выглядит примерно так:
ColumnHeader
[[[9 9 9 9 9 13 ][11 11 11 11 11 11 ][11 11 11 11 11 11 ][9 9 9 9 9 9 ]
[[[9 9 9 9 9 9 ][9 9 9 9 9 9 ]]]
[[[9 9 9 9 ][14 14 14 14 ][13 13 13 13 ]]]
Обратите внимание, что каждый список имеет разное количество списков. Кроме того, обратите внимание, что каждый список списков имеет дополнительный [ и ] до и после него, соответственно.
Что я хотел бы сделать, так это в идеале прочитать весь файл xlsx в python (помните, что в файле есть и другие столбцы, содержащие только числа), сохранить его в фрейме данных pandas, но этот столбец выше будет сохранен в виде списка списков. Поэтому, если я позже напечатаю эту колонку, я получу что-то вроде следующего (и эта серия, если ее преобразовать в список, будет списком списков:
ColumnHeader
[[9,9,9,9,9,13],[11,11,11,11,11,11],[11,11,11,11,11,11],[9,9,9,9,9,9]]
[[9,9,9,9,9,9],[9,9,9,9,9,9]]
[[9,9,9,9],[14,14,14,14],[13,13,13,13]]
Если я просто прямо читаю xlsx файл в фрейм данных pandas, он, очевидно, читает эту колонку как текст, а это не то, что я хочу.
Любая помощь в этом была бы весьма признательна.
Али
1 ответ:
Я предлагаю вам загрузить инкриминируемый столбец в виде строки, а затем преобразовать его во вложенный список, используяЭту функцию . Определите функцию, которая принимает строку и возвращает список:
import pandas as pd import ast # Load some test data df = pd.DataFrame({'fake_list' : ['[[[9 9 9 9 9 13 ][11 11 11 11 11 11 ][11 11 11 11 11 11 ][9 9 9 9 9 9 ]]]', '[[[9 9 9 9 9 9 ][9 9 9 9 9 9 ]]] ', '[[[9 9 9 9 ][14 14 14 14 ][13 13 13 13 ]]]'], 'a': [1,2,3], 'b': [4,5,6]}) def fix_list(s): s1 = s.strip() #strip white space at the edge of the string s1 = s1[1:-1] # remove edge parenthesis s1 = s1.replace(' ',',').replace('][', '],[') # make some replacements so that it looks like a nested list return ast.literal_eval(s1) # transform string to a nested listА затем примените функцию к столбцу, который нужно преобразовать:
df['true_list'] = df['fake_list'].apply(fix_list) print df.true_list[0] # [[9, 9, 9, 9, 9, 13], [11, 11, 11, 11, 11, 11], [11, 11, 11, 11, 11, 11], [9, 9, 9, 9, 9, 9]]Кроме того, вы можете преобразовать инкриминируемый столбец при чтении из excel с помощью
converters:df = pd.read_excel('file.xlsx', converters = {'fake_list':fix_list()}
Comments