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

