如何使用Pandas将宽表按dog、cat两列转为长表并聚合为pet分类
pandas宽转长并按计数生成多行的实现方案
你当前使用melt的逻辑是正确的,只需要在其基础上追加过滤、按计数值重复行的操作即可。repeat方法会按照传入的数值重复对应行数,刚好匹配“有3只狗就生成3行dog记录”的需求,过滤value=0的行是为了删除无对应宠物的无效记录。
完整实现代码如下:
示例数据构造(可跳过,直接替换为你自己的数据集即可)
import pandas as pd df = pd.DataFrame({ 'user': ['tom', 'dick', 'harry', 'tina', 'donna', 'hannah'], 'town': ['london', 'miami', 'paris', 'london', 'dallas', 'dallas'], 'dog': [1,0,0,3,0,1], 'cat': [1,1,0,0,1,0] })
核心处理代码
# 宽转长,直接指定分类列名为pets melted = pd.melt(df, id_vars=['user', 'town'], value_vars=['dog', 'cat'], var_name='pets') # 过滤宠物数量为0的行,按数量重复行后删除数量列,重置索引 result = melted[melted['value'] > 0].repeat(melted['value']).drop(columns='value').reset_index(drop=True)
最终输出的result和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者psychcphyscst
相关产品推荐
相关产品推荐

