Pandas DataFrame按No分组生成Color列两两组合的解决方法
解决方案
方案1:直接生成展开的长表输出
针对你第一个期望的逐行展开结果,可直接对原数据按No分组后生成组合再展开,分组后仅5000组的情况下运行效率很高,不会受原数据4000万行的体量影响:
import pandas as pd import itertools as it # 按No分组后,将每组Color的两两组合展开为单行单值 result = df.groupby('No')['Color']\ .apply(lambda x: pd.Series([val for pair in it.combinations(x, 2) for val in pair]))\ .reset_index(name='Color')\ .drop('level_1', axis=1)
运行后得到的result结构和你期望的第一个输出完全一致。
方案2:生成聚合表加组合列输出
针对你需要的聚合表加CombColors列的需求,修正apply的作用对象即可:
第一步:生成正确的聚合表
agg_df = df.groupby('No')['Color'].agg(list).reset_index(name='Colors')
得到的agg_df每行对应一个No,Colors列为该No对应的所有颜色列表。
第二步:生成组合列
# 仅对Colors列做组合计算,再拼接为逗号分隔的字符串 agg_df['CombColors'] = agg_df['Colors'].apply( lambda x: ', '.join([f'{a}, {b}' for a, b in it.combinations(x, 2)]) )
运行后得到的agg_df结构和你期望的第二个输出完全一致。
之前代码出错的原因
你之前写的df.apply(lambda x: list(it.combinations(x,2), axis =1)中,x是每一行的完整记录,包含No和Colors两个字段,combinations会把这两个字段当做输入生成组合,自然得到错误结果。仅需要把apply的作用对象限定为Colors列即可解决问题。
内容的提问来源于stack exchange,提问作者MKay
相关产品推荐
相关产品推荐

