Извлечь единственный элемент из списка в пандах - PullRequest
0 голосов
/ 17 мая 2018

Как извлечь значение из списка? Например,

df = pd.DataFrame([[0, 4, 'Abc', 456, '[45.55%]'],
                   [2, 5.2, 'abc', 5, '[34.54%]'],
                   [0.2, 6, 'xyz', 65, '[12.21%]'],
                   [3, 4.1, 'Xbc', 23, '[99.12%]']], columns=['start', 'end', 'name','body_mass', 'budget'])

Я могу использовать функцию замены строки, как показано ниже. Но я ищу лучшее решение.

df.budget.str.replace('[', '').str.replace(']', '').str.replace('%', '').astype(float)

0    45.55
1    34.54
2    12.21
3    99.12
Name: budget, dtype: float64

В списке есть только 1 элемент, если это имеет значение.

Ответы [ 3 ]

0 голосов
/ 17 мая 2018
df['budget']=df.budget.str.replace('[', '').str.replace(']', '').str.replace('%', '').astype(float)

это заменит весь столбец в вашем наборе данных

0 голосов
/ 17 мая 2018

Использование регулярного выражения:

df.budget.str.extract('(\d*\.?\d+)').astype(float)
0 голосов
/ 17 мая 2018

Это другой способ использования pd.Series.str.replace для удаления%, ast.literal_eval для преобразования строки в список и operator.itemgetter для извлечения первого элемента.

from ast import literal_eval
from operator import itemgetter

df['budget'] = df['budget'].str.replace('%', '')\
                           .apply(literal_eval)\
                           .apply(itemgetter(0))

print(df['budget'])

0    45.55
1    34.54
2    12.21
3    99.12
Name: budget, dtype: float64

Альтернативный метод с использованием регулярного выражения:

import re

pattern = '|'.join([re.escape(i) for i in ('%', '[', ']')])

df['budget'] = df['budget'].str.replace(pattern, '')\
                           .astype(float)
...