Чтение списка списков из столбца файла 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, он, очевидно, читает эту колонку как текст, а это не то, что я хочу.



Любая помощь в этом была бы весьма признательна.



Али

758   1  

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

    Ничего не найдено.