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
答案 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
的每个值构建一个数据透视表。您可能希望使用ptable
对xvalue
进行索引。使用此代码,我得到(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