熊猫的大小和数量有什么区别?


87

groupby("x").countgroupby("x").size熊猫和之间的区别是吗?

大小是否仅排除nil?


4
文档所述,该尺寸“中的NDFrame元件的返回数”,和计数“与非NA的数目返回系列/空观测超过请求的轴线与非浮点数据的作品,以及(检测的NaN和无)”
hamsternik

除了可接受的答案外,我在这里的答案还强调了一些其他有趣的区别。
cs95

Answers:


99

size包含NaN值,count但不:

In [46]:
df = pd.DataFrame({'a':[0,0,1,2,2,2], 'b':[1,2,3,4,np.NaN,4], 'c':np.random.randn(6)})
df

Out[46]:
   a   b         c
0  0   1  1.067627
1  0   2  0.554691
2  1   3  0.458084
3  2   4  0.426635
4  2 NaN -2.238091
5  2   4  1.256943

In [48]:
print(df.groupby(['a'])['b'].count())
print(df.groupby(['a'])['b'].size())

a
0    2
1    1
2    2
Name: b, dtype: int64

a
0    2
1    1
2    3
dtype: int64 

6
我认为count还会在为Series设置大小时返回DataFrame?
Mr_and_Mrs_D

1
.size()函数仅在将.column()用于每列时才获取特定列的聚合值。
Nachiket

@Mr_and_Mrs_D size返回一个整数
boardtc '19

@boardtc df.size返回一个数字-此处讨论了groupby方法,请参阅问题中的链接。
Mr_and_Mrs_D

至于我的问题-当“绑定”到DataFrameGroupBy实例时,count和size确实分别返回DataFrame和Series-该问题绑定到SeriesGroupBy,因此它们都返回一个Series实例
Mr_and_Mrs_D

25

熊猫的大小和数量有什么区别?

其他答案指出了差异,但是,说“计数NaN而没有计数”并不是完全准确的。虽然确实计入NaN,但这实际上是由于返回对象的大小(或长度)而导致的sizecountsizesize被调用。自然地,这还包括NaN的行/值。

因此,总而言之,size返回Series / DataFrame 1的大小,

df = pd.DataFrame({'A': ['x', 'y', np.nan, 'z']})
df

     A
0    x
1    y
2  NaN
3    z

df.A.size
# 4

...同时count计算非NaN值:

df.A.count()
# 3 

请注意,这size是一个属性(与len(df)或产生相同的结果len(df.A))。count是一个功能。

1.DataFrame.size也是一个属性,它返回DataFrame中的元素数(行x列)。


行为与GroupBy-输出结构

除了基本的区别外,调用GroupBy.size()vs时生成的输出的结构也有所不同GroupBy.count()

df = pd.DataFrame({'A': list('aaabbccc'), 'B': ['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x', 'x']})
df
   A    B
0  a    x
1  a    x
2  a  NaN
3  b  NaN
4  b  NaN
5  c  NaN
6  c    x
7  c    x

考虑,

df.groupby('A').size()

A
a    3
b    2
c    3
dtype: int64

与,

df.groupby('A').count()

   B
A   
a  2
b  0
c  2

GroupBy.count当您count在所有列上调用时,返回一个DataFrame ,而GroupBy.size返回一个Series。

原因是size所有列都相同,因此仅返回一个结果。同时,count每列都会调用,因为结果将取决于每列具有多少NaN。


行为与 pivot_table

另一个示例是如何pivot_table处理此数据。假设我们要计算的交叉表

df

   A  B
0  0  1
1  0  1
2  1  2
3  0  2
4  0  0

pd.crosstab(df.A, df.B)  # Result we expect, but with `pivot_table`.

B  0  1  2
A         
0  1  2  1
1  0  0  1

使用pivot_table,您可以发出size

df.pivot_table(index='A', columns='B', aggfunc='size', fill_value=0)

B  0  1  2
A         
0  1  2  1
1  0  0  1

但是count不起作用;返回一个空的DataFrame:

df.pivot_table(index='A', columns='B', aggfunc='count')

Empty DataFrame
Columns: []
Index: [0, 1]

我相信这样'count'做的原因是必须对传递给该values论证的系列进行处理,而当什么都没有通过时,熊猫决定不做任何假设。


7

只是为@Edchum的答案添加一点点,即使数据没有NA值,使用之前的示例,count()的结果也更加冗长:

grouped = df.groupby('a')
grouped.count()
Out[197]: 
   b  c
a      
0  2  2
1  1  1
2  2  3
grouped.size()
Out[198]: 
a
0    2
1    1
2    3
dtype: int64

看起来sizecount熊猫差不多。
QM.py

@ QM.py不,不是。之所以在区别groupby输出解释这里
cs95

1

当我们处理普通数据帧时,只有差异将包含NAN值,这意味着计数行时计数不包括NAN值。

但是,如果我们将这些函数与groupbythen一起使用,则为了获得正确的结果,count()我们必须将任何数字字段与关联,groupby以获取size()不需要这种类型的关联的确切组数。


0

除了上述所有答案外,我还要指出我似乎很重要的另一点区别。

您可以将Panda的Datarame大小和计数与Java的Vectors大小和长度相关联。创建矢量时,会为其分配一些预定义的内存。当我们接近添加元素时可以占用的元素数量时,会为其分配更多的内存。同样,在DataFrame添加元素时,分配给它的内存也会增加。

Size属性给出分配给的存储单元的数量,DataFrame而count提供实际存在于中的元素的数量DataFrame。例如, 在此处输入图片说明

您可以看到虽然有3行DataFrame,但其大小为6。

这个答案盖大小,相对于数量差异DataFrame,而不是Pandas Series。我没有检查会发生什么Series

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.