Как удалить разные строки из нескольких столбцов в пандах - PullRequest
0 голосов
/ 29 мая 2018

У меня есть pd dataframe, который выглядит следующим образом:

    keyword     |    ranks    |search_type | search_volume
0   keyword1    |[{'rank': 1}]| 1          | {'search_volume': 10}
1   keyword1    |[{'rank': 1}]| 2          |{'search_volume': 10}
2   keyword2    |[{'rank': 1}]| 1          |{'search_volume': 390}
3   keyword2    |[{'rank': 1}]| 2          |{'search_volume': 390}
4   keyword3    |[{'rank': 1}]| 1          |{'search_volume': 170}
...

Столбцы ranks и search_volume должны быть целыми числами, содержащими только цифры, и я пытаюсь найти способ удалить [{'rank':, {'search_volume': и и закрывающие скобки, поэтому таблица выглядит так:

    keyword     | ranks |search_type | search_volume
0   keyword1    |   1   |   1        |10
1   keyword1    |   1   |   2        |10
2   keyword2    |   1   |   1        |390
3   keyword2    |   1   |   2        |390
4   keyword3    |   1   |   1        |170
...

Я пробовал это: df['ranks'].replace('[{\'rank\':','',inplace=True) однако ничего не сделал.также это не самый быстрый способ решения этой проблемы.

Я смотрел на эту тему Pandas DataFrame: удаление ненужных частей из строк в столбце , это решение для одногостолбец за раз (было бы хорошо вычеркнуть сразу все необработанные строки), и он возвращает эту ошибку: AttributeError: 'list' object has no attribute 'lstrip'.

Я использую Python 3.

Ответы [ 3 ]

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

Применение применяется:

df['ranks'] = df['ranks'].apply(lambda x: x[0]['rank'])
df['search_volume'] = df['search_volume'].apply(lambda x: x[0]['search_volume'])

БОНУС

Этот вариант будет работать в вашем случае, чтобы сделать его однострочным:

df[['ranks', 'search_volume']] = df[['ranks', 'search_volume']].applymap(lambda x: x[0].values()[0])
0 голосов
/ 29 мая 2018

Если ranks не lists, как выделено @jpp (т. Е. У вас есть строки, такие как '[{'rank':1}]'), вы можете создать их списки, используя ast

import ast
df.ranks.transform(ast.literal_eval).transform(lambda x: x[0]['rank'])
0 голосов
/ 29 мая 2018

Это один из способов использования pd.Series.apply:

df['ranks'] = df['ranks'].apply(lambda x: x[0]['rank'])
df['search_volume'] = df['search_volume'].apply(lambda x: x['search_volume'])

Это предполагает, что ваша серия ranks содержит списки, а ваша серия search_volume содержит словари.

...