熊猫的尺寸和数量有何区别?
- 2024-12-16 08:35:00
- admin 原创
- 177
问题描述:
这就是熊猫groupby("x").count
和的区别吗?groupby("x").size
size 是否仅排除 nil ?
解决方案 1:
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
解决方案 2:
熊猫的尺寸和数量有何区别?
其他答案指出了差异,但是,说“计算 NaN 而不计算”并不完全准确。虽然确实计算了 NaN,但这实际上是由于返回调用它的对象的大小(或长度)而导致的。当然,这还包括 NaN 的行/值。size
`count`size
size
总而言之,返回 Series/DataFrame 1size
的大小,
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()
除了基本区别之外,调用vs时生成的输出的结构也存在差异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 ,而调用 Series 时,
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:
只需在@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
解决方案 4:
当我们处理普通数据框时,唯一的区别是包含 NAN 值,这意味着在计算行数时计数不包括 NAN 值。
但是如果我们使用这些函数groupby
,为了得到正确的结果,count()
我们必须将任何数字字段与之关联以groupby
获取确切的组数,而对于size()
不需要这种类型的关联。
解决方案 5:
除了以上所有答案之外,我还想指出一个我认为重要的区别。
您可以将pandas
'DataFrame
大小和计数与 Java 的Vectors
大小和长度关联起来。当我们创建一个向量时,会为其分配一些预定义的内存。当我们接近它可以容纳的最大元素数量时,会分配更多内存以容纳进一步的添加。同样,当DataFrame
我们添加元素时,分配给它的内存也会增加。
属性size
给出了分配给的内存单元的数量DataFrame
,而count
给出了实际存在的元素数量DataFrame
。例如,
您可以看到,尽管中有 3 行DataFrame
,但其大小却是 6。
此答案涵盖了 和DataFrame
的大小和数量差异pandas
Series
。我还没有检查 会发生什么Series
。
扫码咨询,免费领取项目管理大礼包!