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

dmi*_*dmi 45 python pivot-table pandas

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')
Run Code Online (Sandbox Code Playgroud)

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

如何获得一个数据透视表,其中包含另外两列的一个DataFrame列的唯一值计数
是否有aggfunc用于计数独特之处?我应该用np.bincount()吗?

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


编辑:输出应该是:

Z   Z1  Z2  Z3
Y             
Y1   1   1 NaN
Y2 NaN NaN   1
Run Code Online (Sandbox Code Playgroud)

Cha*_*She 71

你的意思是这样的吗?

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
Run Code Online (Sandbox Code Playgroud)

请注意,使用len假设您NA的DataFrame中没有s.你可以做x.value_counts().count()len(x.dropna().unique())不然.

  • 只是为了用更新的熊猫解决方案来更新它,`aggfunc = pd.Series.nunique`将解决问题并且应该更高效. (30认同)
  • @hume您的评论应该是一个实际的答案,因此更容易找到,尤其是考虑到自2012年以来熊猫发生了重大变化。 (2认同)

小智 26

我认为这会更完美:

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
Run Code Online (Sandbox Code Playgroud)

  • 注意:Pandas不再接受行/列作为参数.https://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html (6认同)
  • 这正是没有晦涩的 lambda 所需要的。 (3认同)
  • @Alper 这是不正确的。使用“count”将计算所有实例,而不仅仅是唯一实例。这个回复没有回答问题。 (3认同)

小智 18

至少版本为0.16的pandas,它没有参数"行"

截至0.23,解决方案是:

df2.pivot_table(values='X', index='Y', columns='Z', aggfunc=pd.Series.nunique)
Run Code Online (Sandbox Code Playgroud)

返回:

Z    Z1   Z2   Z3
Y                
Y1  1.0  1.0  NaN
Y2  NaN  NaN  1.0
Run Code Online (Sandbox Code Playgroud)


Man*_*thy 7

aggfunc=pd.Series.nunique提供不同的计数。完整代码如下:

df2.pivot_table(values='X', rows='Y', cols='Z', aggfunc=pd.Series.nunique)
Run Code Online (Sandbox Code Playgroud)

此解决方案归功于@hume(请参阅已接受答案下的评论)。在此处添加答案以提高可发现性。


Tre*_*ney 6

out = df2.pivot_table(values='X', index='Y', columns='Z', aggfunc=['nunique', 'count', lambda x: len(x.unique()), len])

[out]:
             nunique           count           <lambda>            len          
Z       Z1   Z2   Z3    Z1   Z2   Z3       Z1   Z2   Z3   Z1   Z2   Z3
Y                                                                     
Y1     1.0  1.0  NaN   2.0  1.0  NaN      1.0  1.0  NaN  2.0  1.0  NaN
Y2     NaN  NaN  1.0   NaN  NaN  1.0      NaN  NaN  1.0  NaN  NaN  1.0


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

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

out = df2.pivot_table(values='X', index='Y', columns='Z', aggfunc=['nunique'])

[out]:
             nunique          
Z       Z1   Z2   Z3
Y                   
Y1     1.0  1.0  NaN
Y2     NaN  NaN  1.0
Run Code Online (Sandbox Code Playgroud)