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