我有以下数据框:
d = pd.DataFrame({'UNIQUE_KEY': [1, 2, 3, 4], 'TRANSFORMATION': ['P', 'D', 'N', 'P'],
'DIM_1': ['Y', 'N', 'N', 'Y'], 'DIM_2': ['N', 'N', 'N', 'Y'], 'DIM_3': ['Y', 'Y', 'N', 'Y']})
UNIQUE_KEY TRANSFORMATION DIM_1 DIM_2 DIM_3
0 1 P Y N Y
1 2 D N N Y
2 3 N N N N
3 4 P Y Y Y
我想执行几个groupby
并聚合操作以获得以下输出数据帧:
DIM DIM_VALUE TTL_CASES % CASES % D % N % P
0 DIM_1 'Y' 2 50 0 0 100
1 DIM_1 'N' 2 50 50 50 0
2 DIM_2 'Y' 1 25 0 0 100
3 DIM_2 'N' 3 75 33.3 33.3 33.3
4 DIM_3 'Y' 3 75 33.3 0 66.6
5 DIM_3 'N' 1 25 0 100 0
哪里
-
DIM
是一列,每个DIM_1,2,3
-
DIM_VALUE
是基于每个DIM_1,2,3
的值的分组列 -
TTL_CASES
是计数为UNIQUE_KEY
的列分组依据DIM
和DIM_1,2,3
-
PCT_CASES
是TTL_CASES
每行的百分比 -
%D
,%P
,%N
是TRANSFORMATION
的百分比的UNIQUE_KEY
基于DIM
分组和DIM_1,2,3
我所拥有的是以下内容:
P = d.groupby('TRANSFORMATION')['UNIQUE_KEY'].count().reset_index()
P['Percentage'] = 100 * P['UNIQUE_KEY'] / P['UNIQUE_KEY'].sum()
这给出了 TRANFORMATION
中每个值的百分比但是我如何对每个维度执行此操作并获得我想要的格式的输出数据帧?
提前致谢!
最佳答案
似乎没有简单的方法来实现所需的输出,您需要将问题分解为多个步骤:首先熔化数据帧,将 DIM 之类的列转换为行,然后创建两个石斑鱼对象,使用根据需要石斑鱼对象并将结果分配给输出数据帧
s = d.melt(['UNIQUE_KEY', 'TRANSFORMATION'], var_name='DIM', value_name='DIM_VALUE')
g1 = s.groupby(['DIM'])
g2 = s.groupby(['DIM', 'DIM_VALUE'])
out = pd.DataFrame()
out['TTL_CASES'] = g2['UNIQUE_KEY'].count()
out['%_TTL_CASES'] = out['TTL_CASES'].div(g1['UNIQUE_KEY'].count()).mul(100)
out = out.assign(**g2['TRANSFORMATION'].value_counts(normalize=True).mul(100).unstack(fill_value=0).add_prefix('%'))
结果
DIM DIM_VALUE TTL_CASES %_TTL_CASES %D %N %P
0 DIM_1 N 2 50.0 50.000000 50.000000 0.000000
1 DIM_1 Y 2 50.0 0.000000 0.000000 100.000000
2 DIM_2 N 3 75.0 33.333333 33.333333 33.333333
3 DIM_2 Y 1 25.0 0.000000 0.000000 100.000000
4 DIM_3 N 1 25.0 0.000000 100.000000 0.000000
5 DIM_3 Y 3 75.0 33.333333 0.000000 66.666667
关于python - 将 Pandas Dataframe 转换为特定格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71113352/