我想在一个数据框中重组我的数据:
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)
如何优化代码以使其更有效率?
答案 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