如何按Date与ID对Multi-index执行Roll-up并生成指标?
按Date和ID进行Multi-index Roll-up并生成指标的实现方案
没问题,我来帮你搞定这个多维度聚合的需求!咱们用Python的pandas来实现,这是处理这类表格数据的首选工具,步骤清晰易懂。
第一步:准备输入数据
先把你给出的原始数据转换成pandas的DataFrame格式,方便后续操作:
import pandas as pd # 输入数据 raw_data = { 'Date': ['201712', '201712', '201712', '201801'], 'ID': [123, 456, 123, 123], 'Flag': ['-', '+', '+', '+'], 'Action Type': ['Delete', 'Add', 'Add', 'Change'] } df = pd.DataFrame(raw_data)
第二步:定义聚合规则
根据你的预期输出,我们需要针对Flag和Action Type列分别定义聚合逻辑:
- Flag列:如果同一组(相同Date+ID)里同时存在
-和+,就返回*;只有-返回-,只有+返回+ - Action Type列:去重后将所有不同的操作类型用
&连接,比如同一组有Add和Delete就变成Add & Delete
对应的聚合函数如下:
# 处理Flag的聚合逻辑 def aggregate_flag(series): unique_flags = series.unique() if '-' in unique_flags and '+' in unique_flags: return '*' return '-' if '-' in unique_flags else '+' # 处理Action Type的聚合逻辑(去重后排序拼接,保证结果顺序统一) def aggregate_action(series): unique_actions = sorted(series.unique()) return ' & '.join(unique_actions)
第三步:执行Multi-index Roll-up
用groupby按Date和ID分组,然后应用上面定义的聚合函数即可:
# 方案1:聚合后Date和ID保持为普通列 result_as_columns = df.groupby(['Date', 'ID'], as_index=False).agg({ 'Flag': aggregate_flag, 'Action Type': aggregate_action }) # 方案2:聚合后Date和ID作为Multi-index(符合你说的Multi-index Roll-up) result_as_multiindex = df.groupby(['Date', 'ID']).agg({ 'Flag': aggregate_flag, 'Action Type': aggregate_action })
第四步:查看结果
运行上面的代码后,result_as_columns的输出就是你预期的格式:
| Date | ID | Flag | Action Type |
|---|---|---|---|
| 201712 | 123 | * | Add & Delete |
| 201712 | 456 | + | Add |
| 201801 | 123 | + | Change |
如果用result_as_multiindex,则会得到以Date和ID为复合索引的结果:
Flag Action Type Date ID 201712 123 * Add & Delete 456 + Add 201801 123 + Change
扩展说明
如果需要额外生成其他指标(比如每个组的行数),只需要在agg里添加对应的规则即可,比如:
result_with_count = df.groupby(['Date', 'ID'], as_index=False).agg({ 'Flag': aggregate_flag, 'Action Type': aggregate_action, 'Record Count': 'size' # 新增计数指标 })
内容的提问来源于stack exchange,提问作者F R
相关产品推荐
相关产品推荐

