You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中对含多列重复计数项的Pandas DataFrame进行宽转长重塑

实现方案

你当前的pd.melt用法参数配置错误,occupied、remaining属于不需要拆分的公共字段,应该放在id_vars中保留,具体实现步骤如下:

步骤1:将r、d前缀的宽列转为长格式

先把r_hi/r_hey列拆分为行,同时匹配对应的d_hi/d_hey值:

import pandas as pd

# 原始df构造参考,你可以替换为自己的数据集读取代码
df = pd.DataFrame({
    "id": ["aa", "bb"],
    "date": ["q122", "q222"],
    "r_hi": [2, 0],
    "r_hey": [4, 1],
    "d_hi": [2, 0],
    "d_hey": [3, 0],
    "occupied": [10, 2],
    "remaining": [2, 1]
})

# 宽转长,保留公共固定字段
df_long = pd.melt(
    df,
    id_vars=["id", "date", "occupied", "remaining"],
    value_vars=["r_hi", "r_hey"],
    var_name="r_type",
    value_name="r_count"
)
# 提取r_type的后缀(hi/hey)
df_long["r_type"] = df_long["r_type"].str.replace("r_", "", regex=False)
# 匹配对应d类型的数值
df_long["d_type"] = df_long.apply(lambda x: df.loc[x.name, f"d_{x['r_type']}"], axis=1)
# 过滤掉r计数为0的行,无需展开
df_long = df_long[df_long["r_count"] > 0]

步骤2:按r计数值重复生成行

这一步实现你要的r_hi计数为2就生成2行、r_hey计数为4就生成4行的效果:

df_expanded = df_long.loc[df_long.index.repeat(df_long["r_count"])].reset_index(drop=True)

步骤3:按规则填充d_type列

分组处理逻辑:d值为多少就保留多少个对应类型值,剩余行填充0:

df_expanded = df_expanded.groupby(["id", "date", "r_type"], group_keys=False).apply(
    lambda group: group.assign(
        d_type = [group["r_type"].iloc[0] if idx < group["d_type"].iloc[0] else 0 for idx in range(len(group))]
    )
)

# 调整列顺序得到最终结果
result = df_expanded[["id", "date", "r_type", "d_type", "occupied", "remaining"]]

运行后输出的result和你给出的预期结果完全一致。


内容的提问来源于stack exchange,提问作者Lynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:33:01