我正在嘗試創建一個像資料透視表一樣groupby用于按incidents年度統計分組的資料,如下所示:
原始資料(樣本):
INCIDENT INCIDENT_YEAR
run 2020
walk 2021
jump 2019
run 2021
run 2020
我想groupby看起來像:
INCIDENT 2019 2020 2021
jump 1
run 2 1
walk 1
我知道這可以在 Excel 中完成,但我想學習如何在 pandas 中完成。
我最好的嘗試是
df.groupby('INCIDENT').count()
但這并沒有給我所需的列。
uj5u.com熱心網友回復:
使用pd.crosstab:
stats = pd.crosstab(df['INCIDENT'], df['INCIDENT_YEAR'])
輸出:
>>> stats
INCIDENT_YEAR 2019 2020 2021
INCIDENT
jump 1 0 0
run 0 2 1
walk 0 0 1
uj5u.com熱心網友回復:
更新 2
如果您有其他級別的分組:
df.groupby(['INCIDENT', 'DISTRICT', 'INCIDENT_YEAR']).size().unstack(fill_value=0)
# OR
df.assign(dummy=1).pivot_table('dummy', ['INCIDENT', 'DISTRICT'], 'INCIDENT_YEAR',
aggfunc='sum', fill_value=0)
# Output
INCIDENT_YEAR 2019 2020 2021
INCIDENT DISTRICT
jump District A 1 0 0
run District A 0 2 1
walk District A 0 0 1
更新
也可以使用groupby:
>>> df.groupby(['INCIDENT', 'INCIDENT_YEAR']).size().unstack(fill_value=0)
INCIDENT_YEAR 2019 2020 2021
INCIDENT
jump 1 0 0
run 0 2 1
walk 0 0 1
您可以使用以下pivot_table替代方法pd.crosstab:
>>> df.assign(dummy=1).pivot_table('dummy', 'INCIDENT', 'INCIDENT_YEAR',
aggfunc='sum', fill_value=0)
INCIDENT_YEAR 2019 2020 2021
INCIDENT
jump 1 0 0
run 0 2 1
walk 0 0 1
uj5u.com熱心網友回復:
你可以使用crosstab:
out = pd.crosstab(df['INCIDENT'], df['INCIDENT_YEAR']).reset_index().rename_axis(columns=[None])
輸出:
INCIDENT 2019 2020 2021
0 jump 1 0 0
1 run 0 2 1
2 walk 0 0 1
uj5u.com熱心網友回復:
雖然 enke 和 richardec 的答案仍然是最受歡迎的,但增加了一點多樣性:
df.reset_index().pivot_table(index='INCIDENT',columns='INCIDENT_YEAR',values='index',aggfunc='count',fill_value=0)
輸出:
INCIDENT_YEAR 2019 2020 2021
INCIDENT
jump 1.0 0 0
run 0 2.0 1.0
walk 0 0 1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446239.html
標籤:Python python-3.x 熊猫 数据框 数据透视表
