pandas 中的大小和计数有什么区别?

What is the difference between size and count in pandas?

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

size是否只排除nil?

size includes NaN values, 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() 不需要此类关联的组数。

What is the difference between size and count in pandas?

其他答案已经指出了差异,但是,不完全准确说“size 计算 NaN 而 count 不计算” .虽然 size 确实计算 NaN,但这实际上是 size returns size(或length) 它被调用的对象。当然,这也包括 rows/values 是 NaN。

所以,总而言之,size returns 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) 相同的结果)。 count 是一个函数。

1. DataFrame.size 也是一个属性,returns 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 returns 当您在所有列上调用 count 时一个 DataFrame,而 GroupBy.size returns 一个系列。

原因是 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 参数的系列上完成,当没有传递任何内容时,pandas 决定制作没有假设。

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

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

size 属性给出了分配给 DataFrame 的内存单元数,而 count 给出了 DataFrame 中实际存在的元素数。例如,

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

此答案涵盖了 DataFrame 而非 pandas Series 的大小和计数差异。我还没有检查 Series.

会发生什么