寻找一种更有效的方法来从数据框列中的字典中创建新列

时间:2018-09-14 15:36:25

标签: python python-3.x pandas dataframe

我想在一个数据框中重组我的数据:

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 :(得分:1)

使用

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

答案 1 :(得分:1)

您可以使用limit the number of replacements和列表理解功能来打开城市和国家/地区的包装。

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

答案 2 :(得分:0)

您可以选中concat

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

出[232]:

  order_id address_city address_country_code
0        A           NY                   US
1        B           KL                   MY