首页 > 解决方案 > 如何通过拆分现有的 pandas 列来创建新的列

问题描述

我有一个熊猫 DF,它看起来像:

Keyword |              ranks              | search_type |   search_volume
kw1     |[{'rank': 1, 'url': example.com}]|  1          |   500
kw1     |[{'rank': 1, 'url': example.com}]|  2          |   500
kw2     |[{'rank': 2, 'url': example.com}]|  1          |   1500
kw2     |[{'rank': 2, 'url': example.com}]|  2          |   1500
kw3     |[{'rank': 1, 'url': example.com}]|  1          |   60
kw3     |[{'rank': 1, 'url': example.com}]|  2          |   60

我想要的是分成ranks两列:ranks其中包含排名,以及一个名为url包含 url 的新列,因此生成的 df 将如下所示:

Keyword |   ranks    |        url          | search_type |   search_volume
kw1     |[{'rank': 1 | 'url': example.com}]|  1          |   500
kw1     |[{'rank': 1 | 'url': example.com}]|  2          |   500
kw2     |[{'rank': 2 | 'url': example.com}]|  1          |   1500
kw2     |[{'rank': 2 | 'url': example.com}]|  2          |   1500
kw3     |[{'rank': 1 | 'url': example.com}]|  1          |   60
kw3     |[{'rank': 1 | 'url': example.com}]|  2          |   60

到目前为止,我已经尝试过:

df.ranks = df.ranks.str.split(',',1).tolist()这会带回一个Nans 列表,我也尝试过df['ranks'].str.split(',', expand=True)哪个不起作用。我试过了:

df = pd.DataFrame(df.ranks.str.split(' ',1).tolist(),columns = ['ranks','url'])

但我得到ValueError: Shape of passed values is (1, 400), indices imply (2, 400)了回报。

编辑:df.ranks.dtype退货dtype('0') type(df.ranks)退货pandas.core.series.Series

标签: pythonpandas

解决方案


我认为有lists dicts,所以建议使用列表推导和选择列表的第一个字典并按keys 选择:

df['r'] = [x[0]['rank'] for x in df['ranks']]
df['u'] = [x[0]['url'] for x in df['ranks']]
print (df)
  Keyword                                ranks  search_type  search_volume  r  \
0     kw1  [{'rank': 1, 'url': 'example.com'}]            1            500  1   
1     kw1  [{'rank': 1, 'url': 'example.com'}]            2            500  1   
2     kw2  [{'rank': 2, 'url': 'example.com'}]            1           1500  2   
3     kw2  [{'rank': 2, 'url': 'example.com'}]            2           1500  2   
4     kw3  [{'rank': 1, 'url': 'example.com'}]            1             60  1   
5     kw3  [{'rank': 1, 'url': 'example.com'}]            2             60  1   

             u  
0  example.com  
1  example.com  
2  example.com  
3  example.com  
4  example.com  
5  example.com 

或者:

df['r'] = [{'rank': x[0]['rank']} for x in df['ranks']]
df['u'] = [{'url': x[0]['url']} for x in df['ranks']]
print (df)
  Keyword                                ranks  search_type  search_volume  \
0     kw1  [{'rank': 1, 'url': 'example.com'}]            1            500   
1     kw1  [{'rank': 1, 'url': 'example.com'}]            2            500   
2     kw2  [{'rank': 2, 'url': 'example.com'}]            1           1500   
3     kw2  [{'rank': 2, 'url': 'example.com'}]            2           1500   
4     kw3  [{'rank': 1, 'url': 'example.com'}]            1             60   
5     kw3  [{'rank': 1, 'url': 'example.com'}]            2             60   

             r                       u  
0  {'rank': 1}  {'url': 'example.com'}  
1  {'rank': 1}  {'url': 'example.com'}  
2  {'rank': 2}  {'url': 'example.com'}  
3  {'rank': 2}  {'url': 'example.com'}  
4  {'rank': 1}  {'url': 'example.com'}  
5  {'rank': 1}  {'url': 'example.com'}  

推荐阅读