Pandalarda boyut ve sayı arasındaki fark nedir?


96

Pandalar arasındaki groupby("x").countve groupby("x").sizearasındaki fark bu mu?

Boyut nil'i hariç mi tutuyor?


4
Belgelere göre, boyut "NDFrame'deki öğelerin sayısını döndür" ve "dönüş Serisini, istenen eksen üzerinde NA olmayan / boş gözlemlerin sayısı ile sayın. Kayan olmayan nokta verileriyle de çalışır (NaN ve Yok algılar)"
hamsternik

1
Kabul edilen cevap, farkın NaNdeğerleri içerdiğini veya hariç tuttuğunu belirtir , bunun ikincil bir nokta olduğuna dikkat edilmelidir. Çıktılarını karşılaştırın df.groupby('key').size()ve df.groupby('key').count()çoklu Serisi ile DataFrame için. Aradaki fark açıktır: countdiğer toplama işlevleri ( mean, max...) gibi çalışır , ancak sizegruptaki dizin girişlerinin sayısını almaya özgüdür ve bu nedenle bu işlev için anlamsız olan sütunlardaki değerlere bakmaz. Doğru bir açıklama için @ cs95 cevabına bakın .
dakika

Yanıtlar:


107

sizeNaNdeğerleri içerir , şunları countiçermez:

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
Bence bu sayım, bir Seri boyutundayken bir DataFrame döndürür?
Mr_and_Mrs_D

1
.size () işlevi, her sütun için .column () kullanılırken, yalnızca belirli bir sütunun toplu değerini alır.
Nachiket

@Mr_and_Mrs_D size bir tamsayı döndürür
boardtc

@boardtc df.size bir sayı döndürür - groupby yöntemleri burada tartışılmıştır, sorudaki bağlantılara bakın.
Mr_and_Mrs_D

Soruma gelince - sayı ve boyut gerçekten de DataFrameGroupBy örneğine "bağlandığında" sırasıyla DataFrame ve Series döndürür - soruda SeriesGroupBy'ye bağlıdır, bu nedenle ikisi de bir Series örneği döndürür
Mr_and_Mrs_D

29

Pandalarda boyut ve sayı arasındaki fark nedir?

Diğer cevaplar farklılığa işaret etti, ancak " NaN'leri sayarken saymaz " demek tamamen doğru değildir. Aslında NaN'leri saymakla birlikte , bu aslında çağrıldığı nesnenin boyutunu (veya uzunluğunu) döndüren olgunun bir sonucudur . Doğal olarak bu, NaN olan satırları / değerleri de içerir.sizecountsizesize

Özetlemek gerekirse, sizeSeries / DataFrame 1'in boyutunu döndürür ,

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 olmayan değerleri sayar:

df.A.count()
# 3 

sizeBir öznitelik olduğuna dikkat edin ( len(df)veya ile aynı sonucu verir len(df.A)). countbir işlevdir.

1. DataFrame.sizeaynı zamanda bir özniteliktir ve DataFrame'deki öğelerin sayısını döndürür (satır x sütun).


Davranış GroupBy- Çıktı Yapısı

Temel farkın yanı sıra, GroupBy.size()vs çağrılırken üretilen çıktının yapısında da fark vardır 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

Düşünmek,

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

A
a    3
b    2
c    3
dtype: int64

Karşı,

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

   B
A   
a  2
b  0
c  2

GroupBy.countcountTüm sütunlarda çağırdığınızda bir DataFrame GroupBy.sizedöndürürken bir Series döndürür.

Bunun nedeni sizetüm sütunlar için aynıdır, bu nedenle yalnızca tek bir sonuç döndürülür. Bu arada, countsonuçlar her sütunun kaç NaN'ye sahip olduğuna bağlı olacağından, her sütun için çağrılır.


Davranış pivot_table

Başka bir örnek de pivot_tablebu verinin nasıl ele alındığıdır . Diyelim ki, çapraz tablolamasını hesaplamak istiyoruz

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

İle pivot_tableşunları düzenleyebilirsiniz 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

Ama countçalışmıyor; boş bir DataFrame döndürülür:

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

Empty DataFrame
Columns: []
Index: [0, 1]

Bunun sebebinin argümana 'count'aktarılan dizide yapılması gerektiğine inanıyorum valuesve hiçbir şey geçilmezse pandalar hiçbir varsayımda bulunmaya karar veriyor.


7

@ Edchum'un cevabına biraz eklemek için, verilerin NA değeri olmasa bile, count () 'un sonucu, önceki örneği kullanarak daha ayrıntılıdır:

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

Pandalarda sizezarif bir eşdeğeri gibi görünüyor count.
QM.py

@ QM.py HAYIR, değil. groupbyÇıktıdaki farklılığın nedeni burada açıklanmaktadır .
cs95

1

Normal veri çerçeveleriyle uğraşırken, tek fark NAN değerlerinin dahil edilmesi olacaktır, yani sayım satırları sayarken NAN değerlerini içermez.

Ancak bu işlevleri o zaman ile kullanıyorsak groupby, doğru sonuçları elde etmek için count()herhangi bir sayısal alanı, bu tür bir ilişkilendirmeye gerek olmayan groupbygrupların tam sayısını elde etmek size()için ile ilişkilendirmeliyiz.


0

Yukarıdaki tüm cevaplara ek olarak, önemli göründüğüm bir farklılığa daha dikkat çekmek isterim.

Panda'nın Datarameboyutunu ve sayısını Java'nın Vectorsboyutu ve uzunluğu ile ilişkilendirebilirsiniz. Vektör oluşturduğumuzda ona önceden tanımlanmış bir bellek tahsis edilir. Eleman eklerken işgal edebileceği eleman sayısına yaklaştığımızda, ona daha fazla bellek tahsis edilir. Benzer şekilde, DataFrameeleman ekledikçe, ona ayrılan bellek artar.

Size özniteliği, tahsis edilen bellek hücresinin DataFramesayısını verirken, count, gerçekte bulunan öğelerin sayısını verir DataFrame. Örneğin, görüntü açıklamasını buraya girin

İçerisinde 3 sıra olmasına rağmen DataFrameboyutu 6'dır.

Bu cevap, boyut ve sayı farkına göre DataFrameve değil ile ilgili Pandas Series. Ne olduğunu kontrol etmedimSeries

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.