Как преобразовать тип данных столбца из String в List в pandas? - PullRequest
0 голосов
/ 01 августа 2020

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

Например, я хочу преобразовать строку «['C0020649', 'C0020538', 'C0020649']» в список ['C0020649', 'C0020538', 'C0020649'], чтобы я мог перебирать каждый элемент.

Первоначально я пытался выполнить приведение типов, используя ast.literal_eval(), но он выдает ValueError:

malformed node or string: 14 error. 

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Предполагая, что вы хотите заменить столбец или добавить другой столбец со списком версий каждой ячейки, вот несколько неуклюжее, но не-eval () решение, которое я придумал:

def str_to_list(cell):
    cell = ''.join(c for c in cell if c not in "'[]")
    cell = cell.split(', ')
    return cell

df = pd.DataFrame({'Column 1': ["['C0020649', 'C0020538', 'C0020649']",
                                "['C0050245', 'C0010689', 'C0042623']",
                                "['C0045734', 'C0025325', 'C0023542']"]})

df['Column 1'] = df['Column 1'].apply(str_to_list)

Или, если вы предпочитайте использовать лямбда:

df['Column 1'] = df['Column 1'].apply(lambda cell:
                                      ''.join(c for c in cell if c not in "'[]").split(', '))

Изменить: это, вероятно, сломается, если вы используете "'" "[" "]" или ", " внутри своих строк, но похоже, что вы этого не сделаете, так что все в порядке.

0 голосов
/ 01 августа 2020

Во-первых, dtype для этих столбцов (Series) равно object. Он может содержать строки, списки, числа и т. Д. c. Обычно все они выглядят одинаково, потому что pandas опускает кавычки. pandas не использует строковые dtypes numpy.

df[col].to_numpy() кажется хорошим способом увидеть, каковы фактические элементы Series.

Если столбец содержит списки, tocsv() записывает str(alist) версию списка (или других объектов). Читатель csv загружает их как строки; он не пытается их разбирать. Посмотрите на csv и снова проверьте серию to_numpy().

Серия, содержащую списки:

In [377]: s = pd.Series([[1,2,3],[4,5,6]])                                                           
In [378]: s                                                                                          
Out[378]: 
0    [1, 2, 3]
1    [4, 5, 6]
dtype: object
In [379]: s.to_numpy()                                                                               
Out[379]: array([list([1, 2, 3]), list([4, 5, 6])], dtype=object)

Запись в файл:

In [380]: s.to_csv('test.csv', index=False)                                                          
In [381]: cat test.csv                                                                               
0
"[1, 2, 3]"
"[4, 5, 6]"

чтение из файла:

In [382]: df = pd.read_csv('test.csv')                                                               
In [383]: df                                                                                         
Out[383]: 
           0
0  [1, 2, 3]
1  [4, 5, 6]
In [384]: df.to_numpy()                                                                              
Out[384]: 
array([['[1, 2, 3]'],
       ['[4, 5, 6]']], dtype=object)

Обратите внимание на изменение строк.

applying eval для каждой строки столбца:

In [389]: df1 = df['0'].apply(eval)                                                                  
In [390]: df1                                                                                        
Out[390]: 
0    [1, 2, 3]
1    [4, 5, 6]
Name: 0, dtype: object
In [391]: df1.to_numpy()                                                                             
Out[391]: array([list([1, 2, 3]), list([4, 5, 6])], dtype=object)

Может быть что-то лучше, но это по крайней мере начало.

...