如何在Pandas DataFrame中按用户合并多行购买数据为指定格式
Pandas 按用户分组生成交易序列实现方案
前置条件:已将目标CSV读取为Pandas DataFrame,命名为df。
首先提取所有商品字段:
# 匹配所有以Item开头的商品列 item_cols = [col for col in df.columns if col.startswith('Item')]
第一种输出:按交易批次拼接带括号的序列
实现逻辑:先逐行生成单次交易的括号包裹单元,过滤空值商品后按用户分组拼接所有单元:
# 逐行生成单次交易的括号单元 df['single_trans'] = df[item_cols].apply( lambda row: f"({' '.join(row.dropna().astype(str))})", axis=1 ) # 可选步骤:过滤掉无任何商品购买的空交易单元(即空括号) df = df[df['single_trans'] != '()'] # 按用户分组拼接所有交易单元 result1 = df.groupby('User', as_index=False).agg( Transactions=('single_trans', ''.join) )
第二种输出:全量购买商品逗号拼接
实现逻辑:先将宽表转为长表去除空购买记录,再按用户拼接所有购买过的商品:
# 宽表转长表,删除空值购买记录 long_df = df.melt( id_vars='User', value_vars=item_cols, value_name='Item' ).dropna(subset=['Item']) # 按用户分组拼接所有商品 result2 = long_df.groupby('User', as_index=False).agg( Transactions=('Item', lambda x: ', '.join(x.astype(str))) )
说明
你之前参考的单列分组转列表方案不适用于本次多列空值预处理的场景,上述实现先完成行级商品清洗再做分组聚合,完全匹配需求输出。生成的result1和result2就是你需要的两个目标DataFrame。
内容的提问来源于stack exchange,提问作者Dionisius Pratama
相关产品推荐
相关产品推荐

