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

如何按ID分组提取DataFrame中B、C、D列的唯一值

问题与解决方案

构造目标DataFrame的代码

from pandas import DataFrame
import pandas as pd

sample = DataFrame([
    {'ID': 'no1', 'B': 'Eric','C': 'George','D': 'a'},
    {'ID': 'no1', 'B': 'Eric','C': 'George','D': 'b'},
    {'ID': 'no1', 'B': 'Eric','C': 'George','D': 'c'},
    {'ID': 'no1', 'B': 'Eric','C': 'Genna','D': 'a'},
    {'ID': 'no1', 'B': 'Eric','C': 'Genna','D': 'b'},
    {'ID': 'no1', 'B': 'Eric','C': 'Genna','D': 'c'},
    {'ID': 'no1', 'B': 'aa','C': 'George','D': 'a'},
    {'ID': 'no1', 'B': 'aa','C': 'George','D': 'b'},
    {'ID': 'no1', 'B': 'aa','C': 'George','D': 'c'},
    {'ID': 'no1', 'B': 'aa','C': 'Genna','D': 'a'},
    {'ID': 'no1', 'B': 'aa','C': 'Genna','D': 'b'},
    {'ID': 'no1', 'B': 'aa','C': 'Genna','D': 'c'},
    {'ID': 'no2', 'B': 'Cythina','C': 'Oliver','D': 'x'},
    {'ID': 'no2', 'B': 'Cythina','C': 'Oliver','D': 'y'},
    {'ID': 'no2', 'B': 'Cythina','C': 'Olivia','D': 'x'},
    {'ID': 'no2', 'B': 'Cythina','C': 'Olivia','D': 'y'},
    {'ID': 'no2', 'B': 'Ben','C': 'Oliver','D': 'x'},
    {'ID': 'no2', 'B': 'Ben','C': 'Oliver','D': 'y'},
    {'ID': 'no2', 'B': 'Ben','C': 'Olivia','D': 'x'},
    {'ID': 'no2', 'B': 'Ben','C': 'Olivia','D': 'y'},
])

原始DataFrame内容

ID  B          C    D
0   no1 Eric    George  a
1   no1 Eric    George  b
2   no1 Eric    George  c
3   no1 Eric    Genna   a
4   no1 Eric    Genna   b
5   no1 Eric    Genna   c
6   no1 aa      George  a
7   no1 aa      George  b
8   no1 aa      George  c
9   no1 aa      Genna   a
10  no1 aa      Genna   b
11  no1 aa      Genna   c
12  no2 Cythina Oliver  x
13  no2 Cythina Oliver  y
14  no2 Cythina Olivia  x
15  no2 Cythina Olivia  y
16  no2 Ben     Oliver  x
17  no2 Ben     Oliver  y
18  no2 Ben     Olivia  x
19  no2 Ben     Olivia  y

需求说明

按ID分组,分别提取每个分组内B、C、D列的唯一值,最终输出格式如下(不足的位置填充NULL):

ID B       C       D
0   no1 Eric    George  a
1   no1 aa      Genna   b
2   no1 NULL    NULL    c
3   no2 Cythina Oliver  x
4   no2 Ben     Olivia  y

注:不同ID对应的各列唯一值数量无固定规律,比如有的ID的B列有13个唯一值、C列无值、D列有5个唯一值。

解决代码

def process_group(group):
    # 提取各列的唯一值
    unique_b = group['B'].unique().tolist()
    unique_c = group['C'].unique().tolist()
    unique_d = group['D'].unique().tolist()
    # 取最长的长度作为基准
    max_len = max(len(unique_b), len(unique_c), len(unique_d))
    # 补全长度,不足的用NULL填充
    unique_b += ['NULL'] * (max_len - len(unique_b))
    unique_c += ['NULL'] * (max_len - len(unique_c))
    unique_d += ['NULL'] * (max_len - len(unique_d))
    # 构造分组后的DataFrame
    return pd.DataFrame({
        'ID': [group['ID'].iloc[0]] * max_len,
        'B': unique_b,
        'C': unique_c,
        'D': unique_d
    })

# 按ID分组处理,合并结果
result = sample.groupby('ID').apply(process_group).reset_index(drop=True)
print(result)

输出结果

ID       B       C    D
0   no1    Eric  George    a
1   no1      aa   Genna    b
2   no1    NULL    NULL    c
3   no2  Cythina  Oliver    x
4   no2     Ben  Olivia    y

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:10:24