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


87

それがパンダgroupby("x").countgroupby("x").sizeパンダの違いですか?

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


4
ドキュメントによると、そのサイズは「NDFrame内の要素の数を返す」、カウントは「要求された軸上の非NA / null観測の数を含むシリーズを返す。非浮動小数点データでも機能する(NaNとNoneを検出する)」
hamsternik 2015年

受け入れられた回答に加えて、ここでの私の回答で強調されいる他のいくつかの興味深い違いがあります
cs 9519年

回答:


99

sizeNaN値を含み、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 

6
カウントはシリーズのサイズを決定するときにDataFrameも返すと思いますか?
Mr_and_Mrs_D

1
.size()関数は、.column()がすべての列に使用されている間のみ、特定の列の集計値を取得します。
Nachiket

@Mr_and_Mrs_Dサイズは整数を返す
boardtc

@boardtc df.sizeは数値を返します-groupbyメソッドについてはここで説明します、質問のリンクを参照してください。
Mr_and_Mrs_D

私の質問については-数とサイズDataFrameGroupByインスタンスに「結合」するとき、実際にそれぞれのデータフレームとシリーズを返す-質問にSeriesGroupByにバインドされているので、両方のリターンシリーズインスタンス
Mr_and_Mrs_D

25

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

他の回答は違いを指摘していますが、「NaNをカウントするのにカウントしない」と言うのは完全に正確ではsizeありcountません。一方でsize実際にNaNをカウントしない、これは実際にあるという事実の結果であるsizeリターンサイズのオブジェクトの(または長さ)は、それが上と呼ばれています。当然、これにはNaNである行/値も含まれます。

だから、要約する、sizeシリーズ/データフレームのサイズを返す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()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.countcountすべての列を呼び出すとDataFrameをGroupBy.size返し、Seriesを返します。

その理由sizeは、すべての列で同じであるため、1つの結果のみが返されます。一方、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引数に渡されるシリーズで実行する必要があり、何も渡されない場合、パンダは仮定を行わないことを決定するためだと思います。


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

それはそうですsizeが、エレガント同等であるcountパンダインチ
QM.py 2017

@ QM.pyいいえ、そうではありません。groupby出力の違いの理由はここで説明されています
cs 9519

1

通常のデータフレームを処理している場合、違いはNAN値が含まれることだけです。つまり、行をカウントするときにcountにNAN値が含まれないことを意味します。

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


0

上記のすべての回答に加えて、私が重要と思われるもう1つの違いを指摘したいと思います。

PandaのDatarameサイズとカウントをJavaのVectorsサイズと長さと相関させることができます。ベクターを作成すると、事前定義されたメモリがベクターに割り当てられます。要素を追加するときに占有できる要素の数に近づくと、より多くのメモリが割り当てられます。同様に、DataFrame要素を追加すると、それに割り当てられるメモリが増加します。

サイズ属性は割り当てられたメモリセルのDataFrame数を示し、カウントは実際にに存在する要素の数を示しDataFrameます。例えば、 ここに画像の説明を入力してください

には3行ありますがDataFrame、サイズは6です。

この回答は、サイズとカウントの違いをカバーしDataFrameていPandas Seriesます。私は何が起こるかをチェックしていませんSeries

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.