Python 有没有办法在pandas中执行groupby,以便在行和列中使用相同的功能?
输入表:Python 有没有办法在pandas中执行groupby,以便在行和列中使用相同的功能?,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,输入表: person cat1 cat2 P1 A X P1 B X P2 A X P2 B Y P3 A X P3 B Y 所需表格: B X Y Z X 1 2 0 A Y 0 0 0 Z 0 0 0
person cat1 cat2
P1 A X
P1 B X
P2 A X
P2 B Y
P3 A X
P3 B Y
所需表格:
B
X Y Z
X 1 2 0
A Y 0 0 0
Z 0 0 0
聚合函数可以是唯一的persons-nunique()
迄今为止的代码:
df.groupby(['cat1','cat2']).person.nunique().unstack()
但这并没有给出正确的表格。关于如何做到这一点有什么帮助吗?这相当难看,但似乎可以做到:
df1 = df.groupby('person').apply(lambda g:
g.pivot_table('cat2', None, 'cat1', aggfunc=lambda x: x)
)
df2 = df1.reset_index().drop('level_1', axis=1)
df3 = df2.pivot_table(None, 'A', 'B', aggfunc=lambda x: len(x))
现在确定它在“大数据”(TM)上的效率
本质上,df1
包含的列数与cat1
的列数相同,并用cat2
中的值填充:
cat1 A B
person
p1 cat2 X X
p2 cat2 X Y
p3 cat2 X Y
df2
与杂波消除时相同:
cat1 person A B
0 p1 X X
1 p2 X Y
2 p3 X Y
并且df3
包含以下结果:
person
B X Y
A
X 1 2
为什么它假设A,X的计数等于B,Y(也许这就是为什么它不能以一种明显的方式进行)?P2和P3本质上是相同的行,具有不同的人号。他的操作在数学上叫什么?不起作用<代码>传递值的形状是(2,1),索引意味着(1,1)@在您的问题中,
person
是数据帧中的索引还是列?它是数据帧中的列dataframe@Mysterious但它适用于您的示例,df=pd.DataFrame({'person':['p1','p1','p2','p2','p3','p3'],'cat1':['A','B','B','A','B'],'cat2':['X','X','X','Y','X','Y']})