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

这就是大熊猫 groupby("x").countgroupby("x").size的区别吗?

大小仅仅排除了零吗?

68797 次浏览

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

为了给@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

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

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

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

其他的答案已经指出了不同之处,但是,不完全准确说“ size计算 NaNs,而 count不计算”。虽然 size确实计算 NaNs,但这实际上是因为调用了 size返回对象的 < em > size (或长度)。当然,这也包括 NaN 的行/值。

总结一下,size返回 Series/DataFrame1的大小,

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)相同的结果)。

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

当对所有列调用 count时,GroupBy.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参数的序列上完成,当没有传递任何参数时,熊猫决定不做任何假设。

除了以上所有的答案,我还想指出一个我认为很重要的差异。

您可以将 pandasDataFrame大小和计数与 Java 的 Vectors大小和长度相关联。当我们创建一个向量时,一些预定义的内存被分配给它。当我们接近它所能容纳的最大元素数时,就会分配更多的内存来容纳进一步的添加。类似地,在 DataFrame中,当我们添加元素时,分配给它的内存会增加。

size属性给出分配给 DataFrame的内存单元数,而 count给出实际存在于 DataFrame中的元素数。比如说, enter image description here

您可以看到,即使 DataFrame中有3行,它的大小也是6。

这个答案涵盖的大小和计数方面的差异,DataFrame而不是 pandas Series。我还没有检查发生了什么与 Series