基于另一列最大值合并两个DataFrame及报错解决
解决DataFrame合并并保留每组最大值对应行的问题
报错原因分析
你原来的代码df3 = df1.merge(df2, on='C2', how='inner')['val'].max()执行后,得到的并不是一个DataFrame,而是整个val列的单个最大值(numpy.float64类型)。当你尝试调用head()方法时,单个数值对象自然没有这个属性,所以触发了AttributeError。你的需求是保留每个C2分组下val最大的完整行,而不是求全局最大值,所以原代码的逻辑不符合需求。
正确解决方案
我们需要先从df2中筛选出每个C2对应的val最大的行,再和df1合并,这里提供两种常用方法:
方法1:使用groupby + idxmax
先通过分组找到每个C2组内val最大值对应的行索引,再提取这些行,最后合并:
# 获取每个C2组中val最大的行的索引 max_row_indices = df2.groupby('C2')['val'].idxmax() # 从df2中提取这些行 df2_max_rows = df2.loc[max_row_indices] # 与df1合并得到目标结果 df3 = df1.merge(df2_max_rows, on='C2', how='inner')
方法2:使用sort_values + drop_duplicates
先按C2升序、val降序排序,然后保留每个C2的第一行(即val最大的行),再合并:
# 按C2分组,val降序排序,去重保留每组第一行 df2_max_rows = df2.sort_values(['C2', 'val'], ascending=[True, False]).drop_duplicates('C2') # 合并得到目标DataFrame df3 = df1.merge(df2_max_rows, on='C2', how='inner')
两种方法都能得到你期望的输出:
| C2 | C1 | val |
|---|---|---|
| A | X | 100 |
| B | E | 90 |
| C | G | 100 |
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

