这是pandas中groupby("x").count
和groupby("x").size
之间的区别吗?
大小只是排除nil吗?
答案 0 :(得分:62)
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
中实际存在的元素的数量。例如,
您可以看到DataFrame
中有3行,其大小为6。
此答案涵盖了关于DataFrame
而非Pandas Series
的大小和计数差异。我尚未检查Series