Панды создают столбец и присваивают ему значения из словаря - PullRequest
3 голосов
/ 24 сентября 2019

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

{"regions":[
   {"name": "South America", "code": "SA01,SA02,SA03"},
   {"name": "Asia Pacific", "code": "AP01,AP02,AP03"}
]}

У меня есть df выглядит следующим образом,

id    code
1     SA01
2     SA02
3     SA03
4     AP01
5     AP02
6     AP03

Мне нравится создавать столбец region в dfзначения которого будут основаны на значениях code в regions, поэтому результат будет выглядеть следующим образом:

id    code    region
1     SA01    South America
2     SA02    South America
3     SA03    South America
4     AP01    Asia Pacific
5     AP02    Asia Pacific
6     AP03    Asia Pacific

Мне интересно, как лучше всего это сделать.

Ответы [ 2 ]

6 голосов
/ 24 сентября 2019

Вы можете переопределить свой словарь (d здесь), чтобы иметь отдельную запись code:region для каждого кода, который появляется в строках, и использовать его для сопоставления значений в столбце code:

d_ = {code:sd['name'] for sd in d['regions'] for code in sd['code'].split(',')} 
# {'SA01': 'South America', 'SA02': 'South America', 'SA03': 'South America',...
df['region'] = df.code.map(d_)

print(df)

   id  code         region
0   1  SA01  South America
1   2  SA02  South America
2   3  SA03  South America
3   4  AP01   Asia Pacific
4   5  AP02   Asia Pacific
5   6  AP03   Asia Pacific
1 голос
/ 24 сентября 2019

Этот пример принимает ваш текущий набор данных без каких-либо изменений.Я уверен, что это может быть улучшено кем-то с большим опытом работы с пандами.

import pandas as pd

mydict = {"regions":[
{"name": "South America", "code": "SA01,SA02,SA03"},
{"name": "Asia Pacific", "code": "AP01,AP02,AP03"}
]}

col_names_regions = ['code', 'region name']
df_regions = pd.DataFrame(columns=col_names_regions)

for key, values in mydict.items():
  for value in values:
    codes = value.get('code')
    name = value.get('name')
    for code in codes.split(','):
      df1 = {'code': code, 'region name': name}
      df_regions = df_regions.append(df1, ignore_index=True)

print (df_regions)
# output 
   code    region name
0  SA01  South America
1  SA02  South America
2  SA03  South America
3  AP01   Asia Pacific
4  AP02   Asia Pacific
5  AP03   Asia Pacific
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...