如何按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
相关产品推荐
相关产品推荐

