如何使用dict类型列中的键合并DataFrame?

时间:2018-03-28 07:13:14

标签: python pandas

假设我有两个这样的数据集:

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      γ

我不喜欢的是需要修改两个源数据集。

2 个答案:

答案 0 :(得分:3)

您可以按列表理解创建列表,转换为array并将其用作left_onright_onmerge参数的输入:

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   γ