web-dev-qa-db-ja.com

パンダのサイズと数の違いは何ですか?

groupby("x").countgroupby("x").sizeの違いは、pandas?

サイズはnilを除外するだけですか?

61
Donovan Thomson

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 
73
EdChum

@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

パンダのサイズと数の違いは何ですか?

他の答えは違いを指摘していますが、完全に正確ではありませんsizeはNaNをカウントしますが、countはカウントしません」と言います。 sizeは実際にNaNをカウントしますが、これは実際にはsizesize(またはオブジェクトの長さ呼び出されます。当然、これには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
_

... while 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を返し、_GroupBy.size_はSeriesを返します。

sizeはすべての列で同じであるため、単一の結果のみが返されるためです。一方、結果は各列のNaNの数に依存するため、countは各列に対して呼び出されます。


_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]
_

この理由は、values引数に渡されるシリーズで_'count'_を実行する必要があり、何も渡されない場合、pandasが仮定をしません。

5
cs95

通常のデータフレームを処理する場合、相違点はNAN値を含めることだけです。つまり、行のカウント中にカウントにはNAN値が含まれません。

しかし、groupbyでこれらの関数を使用している場合、count()で正しい結果を得るには、数値フィールドをgroupbyに関連付けて正確な数を取得する必要がありますsize()にこのタイプの関連付けの必要がないグループの.

1
Mukul Taneja