Python Pandas按main key分组,按条件聚合两列数据的实现方法
解决方案
可以通过Pandas分组+自定义聚合函数实现需求,步骤如下:
1. 构造示例数据
先还原输入的DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'main key': [123, 123, 123, 456, 789, 789, 147], 'name': ['abc', 'def', 'ghi', 'abc', np.nan, np.nan, np.nan], 'value': ['Value 1', 'Value 2', 'Value 3', 'Value 4', 'Value 5', 'Value 6', 'Value 7'] })
2. 定义自定义聚合函数
利用题目中「同一组内name要么全为NaN,要么全不为NaN」的特性,针对分组做差异化处理:
def aggregate_group(group): # 判断当前分组的name是否全为空值 if group['name'].isna().all(): # 给每个value添加单引号后用逗号拼接 return ",".join(f"'{v}'" for v in group['value']) else: # 将name和value配对生成字典 return dict(zip(group['name'], group['value']))
3. 分组聚合生成结果
按main key分组后应用自定义函数,最后调整列名:
result = df.groupby('main key', as_index=False).apply(aggregate_group).rename(columns={0: 'dataAggregated'})
最终输出
执行后result的内容与预期完全一致:
| main key | dataAggregated |
|---|---|
| 123 | {'abc':'Value 1','def':'Value 2','ghi':'Value 3'} |
| 456 | {'abc':'Value 4'} |
| 789 | 'Value 5','Value 6' |
| 147 | 'Value 7' |
内容的提问来源于stack exchange,提问作者Kevin Bobby
相关产品推荐
相关产品推荐

