这就是大熊猫 groupby("x").count和 groupby("x").size的区别吗?
groupby("x").count
groupby("x").size
大小仅仅排除了零吗?
size 包括 NaN值,count不包括:
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()不需要这种关联的组的确切数目。
groupby
count()
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)相同的结果)。
len(df)
len(df.A)
DataFrame.size也是一个属性,返回 DataFrame (行 x 列)中的元素数。
DataFrame.size
GroupBy
除了基本的不同之外,在调用 GroupBy.size()和 GroupBy.count()时,生成的输出结构也有所不同。
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。
GroupBy.count
GroupBy.size
原因是所有列的 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参数的序列上完成,当没有传递任何参数时,熊猫决定不做任何假设。
'count'
values
除了以上所有的答案,我还想指出一个我认为很重要的差异。
您可以将 pandas’DataFrame大小和计数与 Java 的 Vectors大小和长度相关联。当我们创建一个向量时,一些预定义的内存被分配给它。当我们接近它所能容纳的最大元素数时,就会分配更多的内存来容纳进一步的添加。类似地,在 DataFrame中,当我们添加元素时,分配给它的内存会增加。
pandas
DataFrame
Vectors
size属性给出分配给 DataFrame的内存单元数,而 count给出实际存在于 DataFrame中的元素数。比如说,
您可以看到,即使 DataFrame中有3行,它的大小也是6。
这个答案涵盖的大小和计数方面的差异,DataFrame而不是 pandas Series。我还没有检查发生了什么与 Series。
Series