groupby("x").count
とgroupby("x").size
の違いは、pandas?
サイズはnilを除外するだけですか?
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
パンダのサイズと数の違いは何ですか?
他の答えは違いを指摘していますが、完全に正確ではありません「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
_
... 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が仮定をしません。
通常のデータフレームを処理する場合、相違点はNAN値を含めることだけです。つまり、行のカウント中にカウントにはNAN値が含まれません。
しかし、groupby
でこれらの関数を使用している場合、count()
で正しい結果を得るには、数値フィールドをgroupby
に関連付けて正確な数を取得する必要がありますsize()
にこのタイプの関連付けの必要がないグループの.