我有這個資料框:
Country AgeRepartition Count
USA above 20 10
USA less than 20 50
USA above 50 40
Canada above 20 50
Canada less than 20 10
Canada above 50 30
我想將此資料框旋轉為按年齡重新磁區型別具有一列,并將百分比作為值。
預期輸出:
Country above 20 less than 20 above 50
USA 10% 50% 40%
Canada 55% 11% 33%
例如,百分比是美國有多少人在所有美國計數中超過 20 (10/(10 50 40))
我怎樣才能做到這一點 ?
uj5u.com熱心網友回復:
您可以在管道中使用pivot pipe,除以每行的總和并乘以 100:
df2 = (df
.pivot(index='Country', columns='AgeRepartition', values='Count')
.pipe(lambda d: d.div(d.sum(axis=1), axis=0).mul(100))
)
輸出:
AgeRepartition above 20 above 50 less than 20
Country
Canada 55.56 33.33 11.11
USA 10.00 40.00 50.00
uj5u.com熱心網友回復:
另一種方法是用groupby transform(sum)求rdiv百分比,用assign賦值回去;然后pivot:
out = (df.assign(Count=df.groupby('Country')['Count'].transform('sum').rdiv(df['Count']).mul(100)
.astype(int).astype(str).add('%'))
.pivot(*df).reset_index().rename_axis(columns=[None]))
輸出:
Country above 20 above 50 less than 20
0 Canada 55% 33% 11%
1 USA 10% 40% 50%
uj5u.com熱心網友回復:
使用DataFrame.pivot除以值sum,使用正確的列順序DataFrame.reindex:
df = (df.pivot('Country','AgeRepartition','Count')
.reindex(columns=df['AgeRepartition'].unique(), index=df['Country'].unique()))
df = df.div(df.sum(axis=1), axis=0).mul(100)
print (df)
AgeRepartition above 20 less than 20 above 50
Country
USA 10.000000 50.000000 40.000000
Canada 55.555556 11.111111 33.333333
新索引值和具有有序分類的新列中相同順序的另一種解決方案:
df['Country'] = pd.Categorical(df['Country'],
ordered=True,
categories=df['Country'].unique())
df['AgeRepartition'] = pd.Categorical(df['AgeRepartition'],
ordered=True,
categories=df['AgeRepartition'].unique())
df = df.pivot('Country','AgeRepartition','Count')
df = df.div(df.sum(axis=1), axis=0).mul(100)
print (df)
AgeRepartition above 20 less than 20 above 50
Country
USA 10.000000 50.000000 40.000000
Canada 55.555556 11.111111 33.333333
uj5u.com熱心網友回復:
最簡單的方法是 pandas 庫中的 .pivot_table
import pandas as pd
df = pd.pivot_table(index=['Country'], columns='AgeRepartition', values='Count' aggfunc='first')
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450686.html
標籤:熊猫
下一篇:熊貓資料框列印重復值
