Pandas Dataframe与部分值重叠合并

时间:2017-11-19 19:02:18

标签: python pandas dataframe merge

我试图弄清楚如何基于数据帧之间的值的部分比较来矢量化数据合并:

说我有一些数据:

df = pd.DataFrame([['Abe', 'AA01', '40'],
                   ['Bill', 'AA02', '42'],
                   ['Carly', 'BB01', '43'],
                   ['Debbie', 'BB02', '44'],
                   ['Edward', '', '45']],
                   columns=['name', 'id', 'age'])

     name    id age
0     Abe  AA01  40
1    Bill  AA02  42
2   Carly  BB01  43
3  Debbie  BB02  44
4  Edward        45

然后我的数据包含一些关于ID的元数据:

meta = pd.DataFrame([['AA', 'Alpha Apples'],
                     ['BB', 'Beta Bananas']],
                     columns=['id-prefix', 'group'])

  id-prefix         group
0        AA  Alpha Apples
1        BB  Beta Bananas

因此'group'由id和id-prefix之间的比较决定。 如何以惯用和合法的方式合并此信息?

我写了这样的话:

df['group'] = ''
for row in meta.values:
    id_prefix, group = row
    df.loc[df.id.str.startswith(id_prefix), 'group'] = group

这会产生正确的数据:

     name    id age         group
0     Abe  AA01  40  Alpha Apples
1    Bill  AA02  42  Alpha Apples
2   Carly  BB01  43  Beta Bananas
3  Debbie  BB02  44  Beta Bananas
4  Edward        45

但它在大型数据帧上并不是非常高效,而且看起来数据帧的循环通常是错误的解决方案而且不鼓励。

解决此问题的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

这应该比你的方法更快。您可以在最后添加.fillna('')

df['group']=df.id.str[:2].map(meta.set_index('id-prefix')['group'])
df
Out[415]: 
     name    id age         group
0     Abe  AA01  40  Alpha Apples
1    Bill  AA02  42  Alpha Apples
2   Carly  BB01  43  Beta Bananas
3  Debbie  BB02  44  Beta Bananas
4  Edward        45           NaN