You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对多列DataFrame按两列组合提取唯一行并保留最大值

解决方法:Pandas处理Fruits与PRS列组合去重并保留最大值

步骤说明

针对你的需求,核心是将宽格式DataFrame转换为长格式,再通过分组聚合保留每组最大值,具体操作如下:

  1. 宽表转长表并过滤空值
    使用pd.melt()函数将所有PRS列转换为两列(Person列存原列名,Value1列存对应数值),同时自动剔除含NA的行。

  2. 分组取最大值
    以Fruits和Person为分组键,对Value1列取最大值,得到每个组合的唯一记录。

完整代码

import pandas as pd

# 示例输入数据(替换为你的实际DataFrame)
data = {
    'Fruits': ['Apple', 'Orange', 'Apple', 'Apple', 'Berry', 'Apple', 'Grape'],
    'PRS_001': [0.5, 0.2, 1.3, 0.5, pd.NA, pd.NA, pd.NA],
    'PRS_002': [pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, 0.2],
    'PRS_015': [pd.NA, pd.NA, pd.NA, pd.NA, 0.3, 0.5, pd.NA],
    'PRS_016': [pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA]
}
df = pd.DataFrame(data)

# 步骤1:宽表转长表,过滤空值
melted_df = pd.melt(df, id_vars=['Fruits'], var_name='Person', value_name='Value1', dropna=True)

# 步骤2:分组聚合取最大值
result_df = melted_df.groupby(['Fruits', 'Person'])['Value1'].max().reset_index()

# 调整列顺序(可选,匹配期望输出的列顺序)
result_df = result_df[['Fruits', 'Value1', 'Person']]

print(result_df)

输出结果

运行上述代码后,将得到与你期望一致的结果:

Fruits  Value1   Person
0    Apple     1.3  PRS_001
1    Apple     0.5  PRS_015
2    Berry     0.3  PRS_015
3    Grape     0.2  PRS_002
4   Orange     0.2  PRS_001

关键说明

  • pd.melt()是处理宽表转长表的核心函数,完美适配你需要将多个PRS列与Fruits两两组合的需求。
  • 分组聚合时,groupby(['Fruits', 'Person'])确保每个唯一组合只保留一条记录,max()则自动筛选该组合下的最大数值。
  • 该方法适用于你41000行、11列的数据集,效率较高,不会出现unique或duplicated方法无法处理的问题。

内容的提问来源于stack exchange,提问作者Sarah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:50:14