如何基于Pandas DataFrame唯一列组合拆分MB列?
Pandas按唯一组合拆分MB列的解决方案
问题描述
给定如下结构的Pandas DataFrame:
TAG TAG_NAME METRIC METRIC_NAME CAPTURE_DATE MB DB PRO SPACE A 2024-03-01 3 DB PRO SPACE B 2024-03-01 4 DB PRO SPACE C 2024-03-01 5 DB PRO SPACE D 2024-03-01 6 DB PRO SPACE E 2024-03-01 7 DB PRO SPACE A 2024-03-01 8 DB PRO SPACE B 2024-03-01 9 DB PRO SPACE C 2024-03-01 10 DB PRO SPACE D 2024-03-01 11 DB PRO SPACE E 2024-03-01 12
需要基于(TAG, TAG_NAME, METRIC, CAPTURE_DATE)的唯一组合拆分MB列,得到如下输出:
TAG TAG_NAME METRIC METRIC_NAME CAPTURE_DATE MB_First MB_Second DB PRO SPACE A 2024-03-01 3 8 DB PRO SPACE B 2024-03-01 4 9 DB PRO SPACE C 2024-03-01 5 10 DB PRO SPACE D 2024-03-01 6 11 DB PRO SPACE E 2024-03-01 7 12
解决方案
可以通过分组生成序号 + 透视表转换的方式实现,步骤如下:
1. 构造示例数据(如果已有数据可跳过)
import pandas as pd data = { 'TAG': ['DB']*10, 'TAG_NAME': ['PRO']*10, 'METRIC': ['SPACE']*10, 'METRIC_NAME': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'], 'CAPTURE_DATE': ['2024-03-01']*10, 'MB': [3,4,5,6,7,8,9,10,11,12] } df = pd.DataFrame(data)
2. 为分组内的行添加序号
对指定的唯一组合列分组,用cumcount()生成从0开始的序号,用来区分同一组合下的不同MB值:
df['seq'] = df.groupby(['TAG', 'TAG_NAME', 'METRIC', 'CAPTURE_DATE']).cumcount()
3. 透视表拆分MB列
使用pivot()将序号转为列名,MB值对应填充,同时保留其他非聚合列:
result = df.pivot( index=['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE'], columns='seq', values='MB' ).reset_index()
4. 重命名列并整理格式
将数字列名改为目标命名,确保输出格式符合要求:
result.columns = ['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE', 'MB_First', 'MB_Second'] print(result)
简化版代码
如果不需要分步调试,可将过程合并为一行:
result = (df.assign(seq=df.groupby(['TAG', 'TAG_NAME', 'METRIC', 'CAPTURE_DATE']).cumcount()) .pivot(index=['TAG', 'TAG_NAME', 'METRIC', 'METRIC_NAME', 'CAPTURE_DATE'], columns='seq', values='MB') .reset_index() .rename(columns={0:'MB_First', 1:'MB_Second'}))
内容的提问来源于stack exchange,提问作者Shanzid Hossain
相关产品推荐
相关产品推荐

