PySpark中移除DataFrame重复水果组合并保留Top N行
处理水果组合DataFrame:去重并筛选Top X行
解决步骤
- 统一水果组合的排序格式:将每行的水果列按升序排序,让相同的水果组合(不管原始顺序)拥有一致的列值,为后续去重做准备。
- 移除重复组合行:基于排序后的水果列去重,由于重复组合的
count值一致,保留任意一行即可。 - 筛选Top X行:将
count转为数值类型后,按降序排序并提取前X行。
完整代码示例
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'first_fruit': ['apple','orange','banana','cherry'], 'second_fruit': ['orange','apple','cherry','apple'], 'third_fruit': ['cherry','cherry','apple','orange'], 'count':['10','10','5','3'] }) # 1. 提取所有水果列 fruit_cols = [col for col in df.columns if 'fruit' in col] # 2. 对每行的水果列值升序排序,统一组合格式 df[fruit_cols] = df[fruit_cols].apply(lambda row: sorted(row), axis=1, result_type='expand') # 3. 基于水果列去重,保留第一行 df_unique = df.drop_duplicates(subset=fruit_cols, keep='first') # 4. 将count转为整数类型(原数据是字符串,确保排序正确) df_unique['count'] = df_unique['count'].astype(int) # 5. 按count降序排序,取前2行(X=2) X = 2 df_top = df_unique.sort_values('count', ascending=False).head(X) # 转换count回字符串(匹配示例输出格式,若不需要可省略) df_top['count'] = df_top['count'].astype(str) print(df_top)
输出结果
first_fruit second_fruit third_fruit count 0 apple orange cherry 10 2 banana cherry apple 5
关键细节说明
- 适配2-5个水果列:通过
fruit_cols动态提取水果列,不管是2列还是5列都能自动处理,无需修改代码。 - 去重逻辑:排序后相同的水果组合会被识别为重复行,
drop_duplicates直接移除冗余行,效率较高。 - count类型转换:示例中
count是字符串格式,必须转为数值类型才能实现正确的降序排序;如果你的原始数据已经是数值型,可以跳过这一步。
内容的提问来源于stack exchange,提问作者MonkeyMonkey
相关产品推荐
相关产品推荐

