Применение функции работает только для одного столбца вместо нескольких? - PullRequest
0 голосов
/ 26 ноября 2018
x = [{'list1':'[1,6]', 'list2':'[1,1]'},
     {'list1':'[1,7]', 'list2':'[1,2]'}]

df = pd.DataFrame(x)

Теперь я собираюсь преобразовать его из строки в тип списка:

df[['list1','list2']].apply(lambda x: ast.literal_eval(x.strip()))

>> ("'Series' object has no attribute 'strip'", 'occurred at index list1')

Таким образом, я получаю сообщение об ошибке, но если выделить только 1 столбец:

d['list1'].apply(lambda x: ast.literal_eval(x.strip()))

>>    0    [1, 6]
      1    [1, 7]
      Name: list1, dtype: object

Почему это происходит?Почему допускается только один столбец вместо нескольких?

1 Ответ

0 голосов
/ 26 ноября 2018

Важно понять, как apply должен работать, чтобы понять, почему он не работает для вас.Каждый столбец (с учетом значения по умолчанию axis=0) итеративно обрабатывается, вы можете увидеть, как, позволяя каждой серии печатать саму себя:

df.apply(lambda x: print(x))
0    [1,6]
1    [1,7]
Name: list1, dtype: object
0    [1,1]
1    [1,2]
Name: list2, dtype: object

И когда вы пытаетесь вызвать (series_object).strip(), ошибка имеет больше смысла.


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

df[['list1','list2']].applymap(ast.literal_eval)

Или

df[['list1','list2']].applymap(pd.eval)

    list1   list2
0  [1, 6]  [1, 1]
1  [1, 7]  [1, 2]

Другие опции также включают в себя:

df.apply(lambda x: x.map(ast.literal_eval))

    list1   list2
0  [1, 6]  [1, 1]
1  [1, 7]  [1, 2]

Среди других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...