[英]Convert a Pandas Dataframe to specific format
我有以下 dataframe:
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
和聚合操作以獲得以下 output dataframe:
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
是一個列,其中包含按DIM
和UNIQUE_KEY
分組的DIM_1,2,3
的計數PCT_CASES
是TTL_CASES
每一行的百分比%D
, %P
, %N
是基於DIM
和DIM_1,2,3
分組的UNIQUE_KEY
TRANSFORMATION
的百分比我有以下內容:
P = d.groupby('TRANSFORMATION')['UNIQUE_KEY'].count().reset_index()
P['Percentage'] = 100 * P['UNIQUE_KEY'] / P['UNIQUE_KEY'].sum()
這給了我TRANFORMATION
中每個值的百分比但是我如何為每個維度執行此操作並以我想要的格式獲得 output dataframe?
提前致謝!
試試下面的代碼:
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_VALUE | TTL_案例 | PCT_CASES | PCT_D | PCT_N | PCT_P |
---|---|---|---|---|---|---|
DIM_1 | 是 | 2個 | 50 | 0 | 0 | 100 |
DIM_1 | 否 | 2個 | 50 | 50 | 50 | 0 |
DIM_2 | 是 | 1個 | 25 | 0 | 0 | 100 |
DIM_2 | 否 | 3個 | 75 | 33.3333 | 33.3333 | 33.3333 |
DIM_3 | 是 | 3個 | 75 | 33.3333 | 0 | 66.6667 |
DIM_3 | 否 | 1個 | 25 | 0 | 100 | 0 |
似乎沒有簡單的方法來實現所需的 output,您需要將問題分解為多個步驟:首先融化 dataframe 以將 DIM 類列轉換為行,然后創建兩個石斑魚對象,使用石斑魚對象計算聚合為需要並將結果分配給 output dataframe
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.