计数为aggfunc的数据透视表给出的结果与value_counts不同

时间:2018-07-13 22:23:14

标签: python pandas pivot-table

我正在处理一些数据,最终遇到了这样的情况:

df = pd.DataFrame({'A': 10000*[1], 'B': np.random.randint(0, 1001, 10000)})

df['level'] = pd.cut(df.B, bins = [0, 200, 400, 600, 800, 1000], 
                     labels = ['i', 'ii', 'iii', 'iv', 'v'])

要计算每个级别中的值数量,执行以下操作时会发现两个不同的答案:

df.level.value_counts(sort = False)

i      1934
ii     1994
iii    2055
iv     2056
v      1952
Name: level, dtype: int64

df.pivot_table(index = 'A', columns = 'level', values = 'B', aggfunc = 'count').loc[1]

level
i      1994
ii     2056
iii    1934
iv     1952
v      2055
Name: 1, dtype: int64

这两种方法都不会给出相同的结果吗?

1 个答案:

答案 0 :(得分:2)

是的,他们应该给出相同的结果。实际上,即使在旧版本的Pandas中,它们也可以做到:

In [22]: pd.__version__
Out[22]: '0.20.3'

In [23]: df = pd.DataFrame({'A': 10000*[1], 'B': np.random.randint(0, 1001, 10000)})
In [24]: df['level'] = pd.cut(df.B, bins = [0, 200, 400, 600, 800, 1000], 
                              labels = ['i', 'ii', 'iii', 'iv', 'v'])

In [25]: df.level.value_counts(sort = False)
Out[25]: 
i      1968
ii     1936
iii    1992
iv     2073
v      2022
Name: level, dtype: int64

In [26]: df.pivot_table(index = 'A', columns = 'level', values = 'B', aggfunc = 'count').loc[1]
Out[26]: 
level
i      1968
ii     1936
iii    1992
iv     2073
v      2022
Name: 1, dtype: int64

使用df.groupby()也可以:

In [27]: df.groupby('level').size()
Out[27]: 
level
i      1968
ii     1936
iii    1992
iv     2073
v      2022
dtype: int64

因此,您使用的版本可能存在一些错误。