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

У меня есть 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(), который возвращает список Nan s, яТакже пробовал 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

Ответы [ 4 ]

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

Ничего себе.Пожалуйста, не используйте эту полосу и разделите хаки.Если у вас есть входные данные в виде строки jsons, просто используйте:

import json

df['rank'].map(lambda x: json.loads(x)[0]['rank'])
df['url'].map(lambda x: json.loads(x)[0]['url'])
0 голосов
/ 31 мая 2018

попробуйте это,

df['ranks'].str.split(', ', expand=True).rename(columns={0:'ranks',1:'url'})

   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
         ranks                   url
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}]
0 голосов
/ 31 мая 2018

Я думаю, что есть list s с dicts, поэтому предложите использовать понимание списка, выбрав первый словарь списка и выбрав по key s:

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'}  
0 голосов
/ 31 мая 2018

strip и split с параметром расширения, установленным в true, т.е.

df[['rank','url']] = df['ranks'].str.strip('{[]}').str.split(',',expand=True).values

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

Вы также можете перейти к преобразованию строки в dict, если нет, то есть

df[['rank','url']] =pd.concat(df['ranks'].apply(literal_eval).apply(pd.io.json.json_normalize).tolist()).values

# df[['rank','url']] =pd.concat(df['ranks'].apply(pd.io.json.json_normalize).tolist()).values # If you have lists with dict 

  Keyword                                ranks  search_type  search_volume  rank          url
0  kw1       [{'rank': 1, 'url': "example.com"}]            1            500     1  example.com
1  kw1       [{'rank': 1, 'url': "example.com"}]            2            500     1  example.com
2  kw2       [{'rank': 2, 'url': "example.com"}]            1           1500     2  example.com
3  kw2       [{'rank': 2, 'url': "example.com"}]            2           1500     2  example.com
4  kw3       [{'rank': 1, 'url': "example.com"}]            1             60     1  example.com
5  kw3       [{'rank': 1, 'url': "example.com"}]            2             60     1  example.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...