如何以多列作为键向DataFrame映射值?
解决多键映射问题:为df1新增匹配df2分组均值的列
针对你的需求,我有两种高效的实现方式,都能解决多键(A+B)映射的问题,下面分别说明:
方法一:使用merge(推荐,高效直观)
这是最稳妥的方式,利用pandas的合并操作直接关联两张表:
- 先对df2按
A和B分组计算C的均值,同时重置索引让A、B回到普通列(避免它们作为索引无法参与合并):
# 生成分组均值表,保留A、B为列 grouped_mean = df2.groupby(['A', 'B'], as_index=False)['C'].mean()
- 将df1和这个分组均值表按
A、B两列左连接,确保保留df1的所有行,最后重命名列得到new_C:
df1 = df1.merge(grouped_mean, on=['A', 'B'], how='left').rename(columns={'C': 'new_C'})
方法二:元组键+map
如果更倾向于字典映射的思路,可以把(A,B)组合成元组作为字典的键(因为字典不支持列表作为键,但支持元组):
- 先构建以
(A,B)元组为键、对应C均值为值的字典:
# 注意这里直接取C列的分组均值再转字典,得到的键就是(A,B)元组 value_map = df2.groupby(['A', 'B'])['C'].mean().to_dict()
- 利用
apply将df1的每一行的A、B转为元组,再映射到字典:
df1['new_C'] = df1.apply(lambda row: value_map[(row['A'], row['B'])], axis=1)
为什么你之前的字典映射失败?
你之前执行df2.groupby(['A', 'B']).mean().to_dict()得到的是嵌套字典,结构是{'C': {(3,1): 5.0, (2,2): 2.0, ...}},无法直接用df1的A、B列去匹配。而上面的方法要么把分组结果转成普通表(merge法),要么直接生成元组键的扁平字典(map法),就解决了多键匹配的问题。
两种方法最终都能得到你期望的结果,其中merge是向量化操作,在处理大数据集时效率更高,更推荐使用。
内容的提问来源于stack exchange,提问作者Olli
相关产品推荐
相关产品推荐

