Python Pandas:使用aggfunc = count unique pivot的数据透视表

时间:2012-10-12 13:43:48

标签: python pandas pivot-table

df2 = pd.DataFrame({'X' : ['X1', 'X1', 'X1', 'X1'], 'Y' : ['Y2','Y1','Y1','Y1'], 'Z' : ['Z3','Z1','Z1','Z2']})

    X   Y   Z
0  X1  Y2  Z3
1  X1  Y1  Z1
2  X1  Y1  Z1
3  X1  Y1  Z2

g=df2.groupby('X')

pd.pivot_table(g, values='X', rows='Y', cols='Z', margins=False, aggfunc='count')
  

回溯(最近一次调用最后一次):... AttributeError:' Index'宾语   没有属性' index'

如何为另外两列获取一个DataFrame列的唯一值计数的数据透视表?
计数aggfunc是唯一的吗?我应该使用np.bincount()吗?

NB。我知道'系列' values_counts()但是我需要一个数据透视表。


编辑:输出应为:

Z   Z1  Z2  Z3
Y             
Y1   1   1 NaN
Y2 NaN NaN   1

8 个答案:

答案 0 :(得分:61)

你的意思是这样吗?

In [39]: df2.pivot_table(values='X', rows='Y', cols='Z', 
                         aggfunc=lambda x: len(x.unique()))
Out[39]: 
Z   Z1  Z2  Z3
Y             
Y1   1   1 NaN
Y2 NaN NaN   1

请注意,使用len假设您的DataFrame中没有NA个。否则,您可以x.value_counts().count()len(x.dropna().unique())

答案 1 :(得分:23)

我认为这会更完美:

df2.pivot_table(values='X',rows=['Y','Z'],cols='X',aggfunc='count')


                 X1 X2
Y   Z       
Y1  Z1   1   1
        Z2   1  NaN
Y2  Z3   1  NaN

答案 2 :(得分:15)

由于熊猫的版本至少为0.16,因此不使用参数“行”

从0.23开始,解决方案将是:

df2.pivot_table(values='X', index='Y', columns='Z', aggfunc=pd.Series.nunique)

返回:

Z    Z1   Z2   Z3
Y                
Y1  1.0  1.0  NaN
Y2  NaN  NaN  1.0

答案 3 :(得分:2)

aggfunc=pd.Series.nunique提供了不同的计数。

为此解决方案提供@hume的信用(请参阅接受的答案下的评论)。在此处添加答案以提高可发现性。

答案 4 :(得分:1)

您可以为X的每个不同值构建一个数据透视表。在这种情况下,

for xval, xgroup in g:
    ptable = pd.pivot_table(xgroup, rows='Y', cols='Z', 
        margins=False, aggfunc=numpy.size)

将为X的每个值构建一个数据透视表。您可能希望使用ptablexvalue进行索引。使用此代码,我得到(X1

     X        
Z   Z1  Z2  Z3
Y             
Y1   2   1 NaN
Y2 NaN NaN   1

答案 5 :(得分:0)

由于没有答案是最新版本的Pandas的最新信息,因此我正在为该问题编写另一种解决方案:

In [1]:
import pandas as pd

# Set exemple
df2 = pd.DataFrame({'X' : ['X1', 'X1', 'X1', 'X1'], 'Y' : ['Y2','Y1','Y1','Y1'], 'Z' : ['Z3','Z1','Z1','Z2']})

# Pivot
pd.crosstab(index=df2['Y'], columns=df2['Z'], values=df2['X'], aggfunc=pd.Series.nunique)

Out [1]:
Z   Z1  Z2  Z3
Y           
Y1  1.0 1.0 NaN
Y2  NaN NaN 1.0

答案 6 :(得分:0)

为了获得最佳性能,我建议DataFrame.drop_duplicates跟进aggfunc='count'

其他人认为aggfunc=pd.Series.nunique可以正常工作。但是,如果您拥有的index组数量很大(> 1000),这可能会很慢。

所以不是(引用@Javier)

df2.pivot_table('X', 'Y', 'Z', aggfunc=pd.Series.nunique)

我建议

df2.drop_duplicates(['X', 'Y', 'Z']).pivot_table('X', 'Y', 'Z', aggfunc='count')

之所以行之有效,是因为它保证了每个子组(('Y', 'Z')的每个组合)将具有'X'的唯一(非重复)值。

答案 7 :(得分:0)

aggfunc=pd.Series.nunique 将仅计算系列的唯一值-在这种情况下,将计算列的唯一值。但这并不能完全反映为aggfunc='count'

的替代方案

为了进行简单计数,最好使用aggfunc=pd.Series.count