簡體   English   中英

將 Pandas Dataframe 轉換為特定格式

[英]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是一個列,其中包含按DIMUNIQUE_KEY分組的DIM_1,2,3的計數
  • PCT_CASESTTL_CASES每一行的百分比
  • %D , %P , %N是基於DIMDIM_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()))

Output:

暗淡 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM