如何从pandas中的几列中删除不同的字符串

时间:2018-05-29 15:31:23

标签: python pandas series

我有一个pd数据框,如下所示:

    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}
...

rankssearch_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: remove unwanted parts from strings in a column,这个解决方案一次只能用于一个列(最好一次删除所有未经过打字的字符串)并返回此错误:{{ 1}}。

我正在使用python 3。

3 个答案:

答案 0 :(得分:3)

这是使用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系列包含词典。

答案 1 :(得分:3)

使用apply:

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])

答案 2 :(得分:0)

如果ranks不是lists,因为@jpp突出显示(即您有'[{'rank':1}]'等字符串),您可以使用ast

制作列表
import ast
df.ranks.transform(ast.literal_eval).transform(lambda x: x[0]['rank'])