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

如何在Pandas DataFrame中按ID列分组并对齐Label与Value列

解决方法

可以通过分组后提取非空值并补全对齐的方式实现需求,具体步骤如下:

1. 构造示例数据(模拟你的输入)

import pandas as pd
import numpy as np

df1 = pd.DataFrame({
    'ID': ['id_1']*5 + ['id_1']*3 + ['id_2']*3 + ['id_2']*6,
    'Label': ['A','B','C','D','E',np.nan,np.nan,np.nan,'F','G','H',np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
    'Value': [np.nan]*5 + [10,20,30] + [np.nan]*3 + [40,50,60,70,80,90]
})

2. 定义分组处理函数

这个函数会对每个ID分组执行以下操作:

  • 提取分组内非空的Label和Value值,转为列表
  • 取两个列表的最大长度作为结果的行数
  • 将两个列表补全到最大长度,不足的位置用NaN填充
  • 构造对齐后的子DataFrame
def align_group(group):
    # 提取非空的Label和Value列表
    labels = group['Label'].dropna().tolist()
    values = group['Value'].dropna().tolist()
    # 确定结果的总行数
    max_len = max(len(labels), len(values))
    # 补全列表到指定长度
    labels_padded = labels + [np.nan] * (max_len - len(labels))
    values_padded = values + [np.nan] * (max_len - len(values))
    # 返回对齐后的子DataFrame
    return pd.DataFrame({
        'ID': [group['ID'].iloc[0]] * max_len,
        'Label': labels_padded,
        'Value': values_padded
    })

3. 应用分组并生成结果

# 分组应用函数,合并结果
result = df1.groupby('ID', group_keys=False).apply(align_group).reset_index(drop=True)

# 查看结果
print(result)

执行后得到的结果就是你需要的对齐效果:

ID Label  Value
0   id_1     A   10.0
1   id_1     B   20.0
2   id_1     C   30.0
3   id_1     D    NaN
4   id_1     E    NaN
5   id_2     F   40.0
6   id_2     G   50.0
7   id_2     H   60.0
8   id_2   NaN   70.0
9   id_2   NaN   80.0
10  id_2   NaN   90.0

如果你的原始数据中空值不是NaN而是空字符串,只需要把dropna()替换成lambda x: x != ''即可调整提取逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:50:09