В поисках более эффективного способа создания новых столбцов из dict в столбце данных - PullRequest
0 голосов
/ 14 сентября 2018

Я хотел бы реструктурировать свои данные в фрейме данных:

df = pd.DataFrame({'order_id': ['A', 'B'],
                    'address': [{'city': "NY", 'latitude': 2.12, 'longitude' : 3.12,'country_code' : "US"},
                                {'city': "KL", 'latitude': 12.12, 'longitude' : 23.12,'country_code' : "MY"}]},
                   columns= ['order_id', 'address'])

df
   order_id address
0    A    {'city': 'NY', 'latitude': 2.12, 'longitude': 3.12, 'country_code': 'US'}
1    B    {'city': 'KL', 'latitude': 12.12, 'longitude': 23.12, 'country_code': 'MY'}

Что мне нужно, это:

  order_id address_city address_country_code
0        A           NY                   US
1        B           KL                   MY

Вот мой рабочий код:

new_cols = ['city', 'country_code']
for col in new_cols:
   df['address_{}'.format(col)] = \
        df['address'].map(lambda x: np.nan if pd.isnull(x) else x[col])
df.drop(['address'], axis=1)

Как я могу оптимизировать код, чтобы сделать его более эффективным?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Вы можете проверить concat

pd.concat([df.order_id,df.address.apply(pd.Series)[['city','country_code']].add_prefix('address_')],axis=1)

Out [232]:

  order_id address_city address_country_code
0        A           NY                   US
1        B           KL                   MY
0 голосов
/ 14 сентября 2018

Вы можете распаковать города и страны, используя zip и понимание списка.

cities, country_codes = zip(*[(d['city'], d['country_code']) for d in df['address']])

>>> pd.DataFrame({
    'order_id': df['order_id'].values, 
    'address_city': cities, 
    'address_country_code': country_codes})[['order_id', 'address_city', 'address_country_code']]
  order_id address_city address_country_code
0        A           NY                   US
1        B           KL                   MY
0 голосов
/ 14 сентября 2018

Использование

In [411]: df[['order_id']].join(
                pd.DataFrame(df.address.values.tolist())[['city', 'country_code']]
                  .add_prefix('address_'))
Out[411]:
  order_id address_city address_country_code
0        A           NY                   US
1        B           KL                   MY

Подробности

In [413]: pd.DataFrame(df.address.values.tolist())
Out[413]:
  city country_code  latitude  longitude
0   NY           US      2.12       3.12
1   KL           MY     12.12      23.12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...