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