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

Don*_*son 69 python numpy pandas difference

这是熊猫groupby("x").countgroupby("x").size熊猫之间的区别?

尺寸只是排除零吗?

EdC*_*ica 80

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 
Run Code Online (Sandbox Code Playgroud)

  • 我认为count还会在为Series设置大小时返回DataFrame? (2认同)

Bub*_*Gut 7

只是为@ 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
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 7

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

其他答案指出了这种差异,但是,说“ 计数NaN而没有计数” 并不完全准确。尽管确实计入了NaN,但这实际上是由于返回被调用对象大小(或长度)这一事实而导致的。自然地,这还包括NaN的行/值。sizecountsizesize

因此,总而言之,size返回Series / DataFrame 1的大小,

df = pd.DataFrame({'A': ['x', 'y', np.nan, 'z']})
df

     A
0    x
1    y
2  NaN
3    z
Run Code Online (Sandbox Code Playgroud)

df.A.size
# 4
Run Code Online (Sandbox Code Playgroud)

...同时count计算非NaN值:

df.A.count()
# 3 
Run Code Online (Sandbox Code Playgroud)

请注意,这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
Run Code Online (Sandbox Code Playgroud)

考虑,

df.groupby('A').size()

A
a    3
b    2
c    3
dtype: int64
Run Code Online (Sandbox Code Playgroud)

与,

df.groupby('A').count()

   B
A   
a  2
b  0
c  2
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

但是count不起作用;返回一个空的DataFrame:

df.pivot_table(index='A', columns='B', aggfunc='count')

Empty DataFrame
Columns: []
Index: [0, 1]
Run Code Online (Sandbox Code Playgroud)

我认为这样'count'做的原因是必须对传递给该values论证的系列进行处理,而当什么都没有通过时,熊猫决定不做任何假设。