我试图弄清楚如何基于数据帧之间的值的部分比较来矢量化数据合并:
说我有一些数据:
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
但它在大型数据帧上并不是非常高效,而且看起来数据帧的循环通常是错误的解决方案而且不鼓励。
解决此问题的更好方法是什么?
答案 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