Как получить список из списка? - PullRequest
0 голосов
/ 04 октября 2018

Я читаю фрейм данных pandas df из файла .csv.Каждая ячейка информационного кадра содержит строку, подобную следующей

for i in df.index:
    for j in df.columns:

df[i][j]
      '[0.109, 0.1455, 0.0, 1.80e-48, 42.070, -14.582]'

. Я хотел бы получить list со значениями np.float.Я пытался

 df[i][j].split()
'[0.109,',
 '0.145,',
 '0.0,',
 '1.80e-48,',
 '42.070,',
 '-14.582]']

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Вы можете использовать ast.literal_eval, и я рекомендую вам избегать цепной индексации.Вместо этого используйте pd.DataFrame.at для быстрого скалярного доступа.Также обратите внимание, что для итерации столбцов вам не нужно обращаться к pd.DataFrame.columns:

from ast import literal_eval

for i in df.index:
    for j in df:
        print(literal_eval(df.at[i, j]))

Если вам нужно применить это для всей серии, вы можете использовать pd.Series.map или понимание списка:

df['col1'] = df['col1'].map(literal_eval)
df['col1'] = [literal_eval(i) for i in df['col1']]

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

df = df.join(pd.DataFrame(df.pop('col1').map(literal_eval).values.tolist()))

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

0 голосов
/ 04 октября 2018

Вы можете использовать функцию python eval(), чтобы преобразовать строку в объект python, а затем превратить в объекты np.float:

map(np.float, eval(df[i][j]))

Это превращает строку всначала список python, затем каждый элемент преобразуется в np.float.

Начиная с np.float == float, вы можете пропустить приведение к np.float и просто выполните

eval(df[i][j])

0 голосов
/ 04 октября 2018

Без внешних модулей это довольно легко сделать с пониманием списка:

A = df[i][j]                     '[0.109, 0.1455, 0.0, 1.80e-48, 42.070, -14.582]'
B = A.strip("[]").split(",")      ['0.109', ' 0.1455', ' 0.0', ' 1.80e-48', ' 42.070', ' -14.582']
C = [float(x) for x in B]         [0.109, 0.1455, 0.0, 1.8e-48, 42.07, -14.582]

Таким образом, одна строка будет:

My_list_of_floats = [float(x) for x in df[i][j].strip("[]").split(",")]
0 голосов
/ 04 октября 2018

Вы можете использовать ast.literal_eval для разбора строки как списка чисел с плавающей запятой:

>>> import ast
>>> ast.literal_eval('[0.109, 0.1455, 0.0, 1.80e-48, 42.070, -14.582]')
[0.109, 0.1455, 0.0, 1.8e-48, 42.07, -14.582]
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...