pivot pandas dataframe 并计算 true 和 false 值

pivot pandas dataframe and count true and false values

我有一个以这种方式构建的 Dataframe:

year    a        b        c        d        e
2020    True     False    True     False    True
2020    False    False    True     False    True
2021    False    False    True     False    True

我想生成一个类型的数据框:

year   col  count_true   count_false
2020    a   1            1
2020    b   0            2
...
2021    a   0            1

我该怎么做?我很确定我应该使用旋转,但我找不到正确的方法。

您可以先将其融化以取消轴心,然后以您想要的方式重建轴心 table。

import pandas as pd
df = pd.DataFrame({'year': {0: 2020, 1: 2020, 2: 2021},
 'a': {0: True, 1: False, 2: False},
 'b': {0: False, 1: False, 2: False},
 'c': {0: True, 1: True, 2: True},
 'd': {0: False, 1: False, 2: False},
 'e': {0: True, 1: True, 2: True}})

df.melt(id_vars='year', 
    var_name='col').pivot_table(index=['year','col'],
                                columns='value',
                                aggfunc=lambda x:len(x), fill_value=0).add_prefix('count_')

输出

value     count_False  count_True
year col                         
2020 a              1           1
     b              2           0
     c              0           2
     d              2           0
     e              0           2
2021 a              1           0
     b              1           0
     c              0           1
     d              1           0
     e              0           1

您需要melt (=unpivot) and groupby.agg:

(df
 .melt(id_vars='year')
 .groupby(['year', 'variable'], as_index=False)
 .agg(**{'count_true': ('value', 'sum'),
         'count_false': ('value', lambda x: (~x).sum()),
        })
)

输出:

   year variable  count_true  count_false
0  2020        a           1            1
1  2020        b           0            2
2  2020        c           2            0
3  2020        d           0            2
4  2020        e           2            0
5  2021        a           0            1
6  2021        b           0            1
7  2021        c           1            0
8  2021        d           0            1
9  2021        e           1            0