假设我有两个这样的数据集:
In [2]: df_names = pd.DataFrame([
...: ['alpha', {'key': 'a'}],
...: ['beta', {'key': 'b'}],
...: ['gamma', {'key': 'g'}],
...: ], columns=['name', 'data'])
...: df_names
Out[2]:
name data
0 alpha {'key': 'a'}
1 beta {'key': 'b'}
2 gamma {'key': 'g'}
In [3]: df_symbols = pd.DataFrame([
...: ['α', {'english_letter': 'a'}],
...: ['β', {'english_letter': 'b'}],
...: ['γ', {'english_letter': 'g'}],
...: ], columns=['symbol', 'meta'])
...: df_symbols
Out[3]:
symbol meta
0 α {'english_letter': 'a'}
1 β {'english_letter': 'b'}
2 γ {'english_letter': 'g'}
现在,我想在左侧的['data']['key']
和右侧的['meta']['english_letter']
加入这两个。
不确定要添加更多内容。你会如何以优雅的方式做到这一点?
我目前的做法:
In [4]: df_names['join_key'] = df_names.apply(lambda x: x['data']['key'], axis=1)
...: df_symbols['join_key'] = df_symbols.apply(lambda x: x['meta']['english_letter'], axis=1)
...: result = pd.merge(df_names, df_symbols, on='join_key')
...: result[['name', 'symbol']]
Out[4]:
name symbol
0 alpha α
1 beta β
2 gamma γ
我不喜欢的是需要修改两个源数据集。
答案 0 :(得分:3)
您可以按列表理解创建列表,转换为array
并将其用作left_on
中right_on
和merge
参数的输入:
a1 = np.array([x['key'] for x in df_names['data']])
a2 = np.array([x['english_letter'] for x in df_symbols['meta']])
r = pd.merge(df_names, df_symbols, left_on=a1, right_on=a2)[['name', 'symbol']]
print (r)
name symbol
0 alpha α
1 beta β
2 gamma γ
答案 1 :(得分:2)
你需要这样的东西: 在每个数据框中创建一个新列,其中包含字典值
df_names['val']=df_names['data'].apply(lambda x: x['key'])
df_symbols['val']=df_symbols['meta'].apply(lambda x: x['english_letter'])
合并新创建的列
上的两个数据帧df = df_names.merge(df_symbols, how='inner', on='val')
df.drop(['data','meta','val'], axis=1, inplace=True)
df
输出
name symbol
0 alpha α
1 beta β
2 gamma γ