为每个变量熊猫创建计数列



使用value_counts和其他一些数据清理后,我的数据格式为:

year  city    category  count_per_city
2005  NYC     1         145
2007  ATL     1         75
2005  NYC     2         55
2006  LA      3         40

我想把它转换成这个:

year  city  1    2   3   total 
2005  NYC   145  55  0   200
2006  LA    0    0   40  40
2007  ATL   75   0   0   75

我觉得有一种相对简单的方法可以做到这一点,但我错过了。

您可以将pivot_table()marginsfill_value:一起使用

out = df.pivot_table(
index=['year', 'city'],
columns='category',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='total'
).drop('total')
#            count_per_city              
# category                1   2   3 total
# year  city                             
# 2005  NYC             145  55   0   200
# 2006  LA                0   0  40    40
# 2007  ATL              75   0   0    75

如果你想要OP的确切输出,你可以做一些清理(感谢@HenryEcker(:

out.droplevel(0, axis=1).rename_axis(columns=None).reset_index()
#    year city    1   2   3  total
# 0  2005  NYC  145  55   0    200
# 1  2006   LA    0   0  40     40
# 2  2007  ATL   75   0   0     75

使用unstack:的另一个解决方案

(
df.set_index(['year', 'city', 'category']).unstack(2)
.droplevel(0, axis=1)
.assign(Total =lambda x: x.fillna(0).apply(sum, axis=1))
.reset_index()
.rename_axis(columns='')
)

最新更新