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

时间:2015-10-26 13:08:36

标签: python pandas numpy difference

这是pandas中groupby("x").countgroupby("x").size之间的区别吗?

大小只是排除nil吗?

5 个答案:

答案 0 :(得分:62)

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 

答案 1 :(得分:6)

只是为@ 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

答案 2 :(得分:5)

  

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

其他答案指出了不同之处,但是说“ size计数NaN而count不计数是不完全准确的。尽管size确实计入了NaN,但这实际上是由于 size返回对象的 size (或长度)它被调用。当然,这还包括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()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,并且当不传递任何内容时,熊猫决定不做任何假设。

答案 3 :(得分:1)

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

但是,如果我们在groupby使用这些函数,那么为了通过count()得到正确的结果,我们必须将任何数字字段与groupby相关联,以获得确切的数字size()所在的组不需要这种类型的关联。

答案 4 :(得分:0)

除了以上所有答案外,我还要指出另外一个我认为很重要的区别。

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

Size属性给出分配给DataFrame的存储单元的数量,而count给出DataFrame中实际存在的元素的数量。例如, enter image description here

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

此答案涵盖了关于DataFrame而非Pandas Series的大小和计数差异。我尚未检查Series

会发生什么