如何对多列DataFrame按两列组合提取唯一行并保留最大值
解决方法:Pandas处理Fruits与PRS列组合去重并保留最大值
步骤说明
针对你的需求,核心是将宽格式DataFrame转换为长格式,再通过分组聚合保留每组最大值,具体操作如下:
宽表转长表并过滤空值
使用pd.melt()函数将所有PRS列转换为两列(Person列存原列名,Value1列存对应数值),同时自动剔除含NA的行。分组取最大值
以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
相关产品推荐
相关产品推荐

