Pandas 使用熊猫从数据透视表中计算布尔值

Pandas 使用熊猫从数据透视表中计算布尔值,pandas,dataframe,boolean,pivot-table,Pandas,Dataframe,Boolean,Pivot Table,我有一个数据帧df定义如下: A B C D E F 0 a z l 1 qqq True 1 a z l 2 qqq True 2 a z l 3 qqq False 3 a z r 1 www True 4 a z r 2 www False 5 a z r 2 www False 6 s x 7 2 eee True 7

我有一个数据帧
df
定义如下:

    A   B   C   D   E   F
0   a   z   l   1   qqq True
1   a   z   l   2   qqq True
2   a   z   l   3   qqq False
3   a   z   r   1   www True
4   a   z   r   2   www False
5   a   z   r   2   www False
6   s   x   7   2   eee True
7   s   x   7   3   eee False
8   s   x   7   4   eee True
9   s   x   5   1   eee True
10  d   c   l   1   rrr True
11  d   c   l   2   rrr False
12  d   c   r   1   fff False
13  d   c   r   2   fff True
14  d   c   r   3   fff True
我的目标是基于列
a
B
C
的唯一值创建一个表,以便我能够计算列
D
的元素数和列
C
中的唯一元素数

输出如下所示:

       D    E
A   B       
a   z   6   2
d   c   5   2
s   x   4   2
        D   E   True    False
A   B               
a   z   6   2      3        3
d   c   5   2      3        2
s   x   4   2      3        1
# My code so far
a = df.pivot_table(index=['A','B','C'], aggfunc={'E':'nunique', 'D':'count','F':sum}).sort_values(by='E').rename(columns={'F':'F_True'})
a = a.pivot_table(index=['A','B'], aggfunc='sum').sort_values(by='E').eval('F_False = D - F_True')
其中,例如,6表示在
A
列中存在多少个具有值
A
的元素,2表示
E
列中唯一元素的数量(
qqq
www

我通过使用以下代码行实现了这一目标:

# Define dataframe
df = pd.DataFrame({'A':['a','a','a','a','a','a','s','s','s','s','d','d','d','d','d'],
                   'B':   ['z','z','z','z','z','z','x','x','x','x','c','c','c','c','c'],
                   'C':  ['l','l','l','r','r','r','7','7','7','5','l','l','r','r','r'],
                   'D':    ['1','2','3','1','2','2','2','3','4','1','1','2','1','2','3'],
                   'E':    ['qqq','qqq','qqq','www','www','www','eee','eee','eee','eee','rrr','rrr','fff','fff','fff'],
                   'F':   [True,True,False,True,False,False,True,False,True,True,True,False,False,True,True]})

# My code so far
a = df.pivot_table(index=['A','B','C'], aggfunc={'E':'nunique', 'D':'count'}).sort_values(by='E')
a = a.pivot_table(index=['A','B'], aggfunc='sum').sort_values(by='E')
问题

现在,我还想用前面给出的相同标准计算数据帧中出现的
True
False
值的数量,结果如下所示:

       D    E
A   B       
a   z   6   2
d   c   5   2
s   x   4   2
        D   E   True    False
A   B               
a   z   6   2      3        3
d   c   5   2      3        2
s   x   4   2      3        1
# My code so far
a = df.pivot_table(index=['A','B','C'], aggfunc={'E':'nunique', 'D':'count','F':sum}).sort_values(by='E').rename(columns={'F':'F_True'})
a = a.pivot_table(index=['A','B'], aggfunc='sum').sort_values(by='E').eval('F_False = D - F_True')
您可以看到
True
值的数量,其中
A
=
A
为3,而
False
值也为3


什么是实现我最终目标的明智而优雅的方法?

你只需要两个步骤

pd.concat([df.groupby(['A','B','C']).agg({'E': 'nunique', 'D':'size'}).sum(level=[0,1])
,df.groupby(['A','B']).F.value_counts().unstack()],1)
Out[702]: 
     E  D  False  True
A B                   
a z  2  6      3     3
d c  2  5      2     3
s x  2  4      1     3
使用
值\u计数

df.groupby(['A','B']).F.value_counts().unstack()

使用您的代码,您可以这样扩展:

       D    E
A   B       
a   z   6   2
d   c   5   2
s   x   4   2
        D   E   True    False
A   B               
a   z   6   2      3        3
d   c   5   2      3        2
s   x   4   2      3        1
# My code so far
a = df.pivot_table(index=['A','B','C'], aggfunc={'E':'nunique', 'D':'count','F':sum}).sort_values(by='E').rename(columns={'F':'F_True'})
a = a.pivot_table(index=['A','B'], aggfunc='sum').sort_values(by='E').eval('F_False = D - F_True')
输出:

     D  E  F_True  F_False
A B                       
a z  6  2     3.0      3.0
d c  5  2     3.0      2.0
s x  4  2     3.0      1.0