将 Pandas 数据框转换为特定格式
Convert a Pandas Dataframe to specific format
我有以下数据框:
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
中每个值的百分比,但是我如何为每个维度执行此操作并获得我想要的格式的输出数据帧?
提前致谢!
试试下面的代码:
代码:
import pandas as pd
# Create a sample dataframe
df = 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']})
# Transform df shape
df = df.set_index(['UNIQUE_KEY', 'TRANSFORMATION']).stack().to_frame().reset_index()
df.columns = ['UNIQUE_KEY', 'TRANSFORMATION', 'DIM', 'DIM_VALUE']
# Get aggregated values except PCT_CASES
df = df.groupby(['DIM', 'DIM_VALUE'], as_index=False).agg(
TTL_CASES=pd.NamedAgg('UNIQUE_KEY', 'count'),
PCT_D=pd.NamedAgg('TRANSFORMATION', lambda s: 100 * (s=='D').sum() / len(s)),
PCT_N=pd.NamedAgg('TRANSFORMATION', lambda s: 100 * (s=='N').sum() / len(s)),
PCT_P=pd.NamedAgg('TRANSFORMATION', lambda s: 100 * (s=='P').sum() / len(s)),
).sort_values(['DIM', 'DIM_VALUE'], ascending=[True, False])
# Add PCT_CASES
df.insert(3, 'PCT_CASES', df.groupby('DIM')['TTL_CASES'].transform(lambda s: 100 * s / s.sum()))
输出:
DIM
DIM_VALUE
TTL_CASES
PCT_CASES
PCT_D
PCT_N
PCT_P
DIM_1
Y
2
50
0
0
100
DIM_1
N
2
50
50
50
0
DIM_2
Y
1
25
0
0
100
DIM_2
N
3
75
33.3333
33.3333
33.3333
DIM_3
Y
3
75
33.3333
0
66.6667
DIM_3
N
1
25
0
100
0
似乎没有简单的方法来实现所需的输出,您需要将问题分解为多个步骤:首先融化数据框以将像列一样的 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
我有以下数据框:
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
中每个值的百分比,但是我如何为每个维度执行此操作并获得我想要的格式的输出数据帧?
提前致谢!
试试下面的代码:
代码:
import pandas as pd
# Create a sample dataframe
df = 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']})
# Transform df shape
df = df.set_index(['UNIQUE_KEY', 'TRANSFORMATION']).stack().to_frame().reset_index()
df.columns = ['UNIQUE_KEY', 'TRANSFORMATION', 'DIM', 'DIM_VALUE']
# Get aggregated values except PCT_CASES
df = df.groupby(['DIM', 'DIM_VALUE'], as_index=False).agg(
TTL_CASES=pd.NamedAgg('UNIQUE_KEY', 'count'),
PCT_D=pd.NamedAgg('TRANSFORMATION', lambda s: 100 * (s=='D').sum() / len(s)),
PCT_N=pd.NamedAgg('TRANSFORMATION', lambda s: 100 * (s=='N').sum() / len(s)),
PCT_P=pd.NamedAgg('TRANSFORMATION', lambda s: 100 * (s=='P').sum() / len(s)),
).sort_values(['DIM', 'DIM_VALUE'], ascending=[True, False])
# Add PCT_CASES
df.insert(3, 'PCT_CASES', df.groupby('DIM')['TTL_CASES'].transform(lambda s: 100 * s / s.sum()))
输出:
DIM | DIM_VALUE | TTL_CASES | PCT_CASES | PCT_D | PCT_N | PCT_P |
---|---|---|---|---|---|---|
DIM_1 | Y | 2 | 50 | 0 | 0 | 100 |
DIM_1 | N | 2 | 50 | 50 | 50 | 0 |
DIM_2 | Y | 1 | 25 | 0 | 0 | 100 |
DIM_2 | N | 3 | 75 | 33.3333 | 33.3333 | 33.3333 |
DIM_3 | Y | 3 | 75 | 33.3333 | 0 | 66.6667 |
DIM_3 | N | 1 | 25 | 0 | 100 | 0 |
似乎没有简单的方法来实现所需的输出,您需要将问题分解为多个步骤:首先融化数据框以将像列一样的 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