使用pandas计算Pivot表中的布尔值

时间:2018-03-20 15:24:51

标签: 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   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

我的目标是根据列ABC的唯一值创建表格,以便我能够计算列{{1}的元素数量}}以及D列中唯一的元素数。

输出如下:

C

例如,6是 D E A B a z 6 2 d c 5 2 s x 4 2 A中有多少元素,{2}表示a列中唯一元素的数量({{1} },E)。

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

qqq

问题

现在,我还要计算数据框中出现的wwww# 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 True False A B a z 6 2 3 3 d c 5 2 3 2 s x 4 2 3 1 为3的True值的数量,而A值也为3。

实现我最终目标的智能和优雅方式是什么?

2 个答案:

答案 0 :(得分:4)

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

# 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

答案 1 :(得分: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

使用value_counts

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