Panda sayısı (farklı) eşdeğeri


289

Birden fazla veritabanı (oracle, mssql, vb) var gibi bir db yerine pandalar kullanıyorum ve SQL eşdeğeri için bir komut dizisi yapamıyorum.

Bazı sütunlarla DataFrame yüklü bir tablo var:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc

SQL'de, yılda farklı müşteri miktarını saymak şöyle olur:

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;

Ve sonuç şu olur:

201301    5000
201302    13245

Bunu pandalarda nasıl yapabilirim?


Table.groupby (['YEARMONTH']) ['CLIENTCODE']. Unique () yaptım ve YEARMONTH tarafından endekslenen iki seri ve tüm benzersiz değerlerle geldim. Her bir serideki değerlerin miktarı nasıl hesaplanır?
Adriano Almeida

Bazıları value_countsiçin aradığınız cevap olabilir: pandas.pydata.org/pandas-docs/stable/generated/…
sachinruk

Yanıtlar:


434

İstediğin bu olduğuna inanıyorum:

table.groupby('YEARMONTH').CLIENTCODE.nunique()

Misal:

In [2]: table
Out[2]: 
   CLIENTCODE  YEARMONTH
0           1     201301
1           1     201301
2           2     201301
3           1     201302
4           2     201302
5           2     201302
6           3     201302

In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique()
Out[3]: 
YEARMONTH
201301       2
201302       3

2
.Drop_duplicates (subset = ['col1', 'col2']) gibi birlikte benzersiz olmasını istediğim birden çok sütunum varsa ne olur?
ErnestScribbler

4
Bu benzersiz sayıya nasıl erişilir. Sütun adı olmadığı için
Tarun Khaneja

Teşekkürler lot, bu örneği resample çıktısında kullandım. df_watch_record.resample ('M'). user.nunique (), ayda film izleyen benzersiz kullanıcıların sayısını sayar.
Mehdi Kazemi

1
ve bunları table.groupby ('YEARMONTH') ile sıralayın. CLIENTCODE.nunique (). sort_values ​​(ascending = False)
wllbll

Grup tanımlayıcısını sonra almak mümkün müdür nunique? Tahmin edebileceğim gibi bir yol bulamıyorum, çünkü bu cevabın sonucu a Seriesdeğil, a DataFrame.
Josh Hansen

93

İşte başka bir yöntem, çok basit, diyelim ki veri çerçevesi adınız daatve sütun adınızYEARMONTH

daat.YEARMONTH.value_counts()

1
Bu cevabı beğendim. Sütun adımda '.' Varsa bu yöntemi nasıl kullanabilirim? içinde (örneğin 'ck.Class')? Teşekkürler

5
daat ['ck.Class']. value_counts ()
StatguyUser

28
Bu, sorulan soruya değinmez.
Aaron Schumacher

6
bu, her grubun sahip olduğu belirli bir sütunun benzersiz değerini değil, her gruptaki gözlem sayısını sayar.
Jason Goal

2
Bu yanlış cevap; DISTINCTsorudan gelen gereksinimi yansıtmaz ! Ayrıca, sayıları içermez NaN!
Corey Levinson

47

İlginçtir ki, genellikle len(unique())birkaç kat (3x-15x) daha hızlıdır nunique().


11
Bunu mu demek istiyorsun? .CLIENTCODE.apply(lambda x: len(x.unique())), buradan
user4015990

6
@ user32185 applylambda ile bir görüşmeye bırakmak zorunda kalacaksınız . Örneğin df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0]),.
3novak

3
Sözdizimi tamamen açık değil, len(df['column'].unique())lambda işlevine gerek
duymadım

Bende TypeError: object of type 'method' has no len()gelen Chen's, yorum 3novak'sbenim için çalıştı.
Jason Goal

4

Kullanıldığında crosstab, bu daha fazla bilgi döndürürgroupby nunique

pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]: 
CLIENTCODE  1  2  3
YEARMONTH          
201301      2  1  0
201302      1  2  1

Biraz değişiklik yaptıktan sonra sonucu verin

pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]: 
YEARMONTH
201301    2
201302    3
dtype: int64

Bunu iki sütun YEARMONTHve olarak nasıl dışa aktarabilirim count. Ayrıca sayıyı azalan sırada ayarlayabilir miyim?
Murtaza Haji

3

Ben de kullanıyorum nuniqueama 'min', 'max', 'count' or 'mean'vb gibi bir toplama işlevi kullanmak zorundaysanız çok yararlı olacaktır .

df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count

0

Yeni panda versiyonuyla, veri çerçevesi olarak almak kolaydır

unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))

0

Burada, sayıları birden çok sütuna göre ayırma yaklaşımları Biraz veri alalım:

data = {'CLIENT_CODE':[1,1,2,1,2,2,3],
        'YEAR_MONTH':[201301,201301,201301,201302,201302,201302,201302],
        'PRODUCT_CODE': [100,150,220,400,50,80,100]
       }
table = pd.DataFrame(data)
table

CLIENT_CODE YEAR_MONTH  PRODUCT_CODE
0   1       201301      100
1   1       201301      150
2   2       201301      220
3   1       201302      400
4   2       201302      50
5   2       201302      80
6   3       201302      100

Şimdi, ilgili sütunları listeleyin ve biraz değiştirilmiş bir sözdiziminde groupby öğesini kullanın:

columns = ['YEAR_MONTH', 'PRODUCT_CODE']
table[columns].groupby(table['CLIENT_CODE']).nunique()

Elde ederiz:

YEAR_MONTH  PRODUCT_CODE CLIENT_CODE        
1           2            3
2           2            3
3           1            1

0

Diğer sütunlardaki toplamalarla birlikte sütun ayrımı

Herhangi bir sütun ( CLIENTCODEsizin durumunuzda) için ayrı sayıda değer elde etmek için kullanabiliriz nunique. Girdiyi agg, diğer sütunlardaki toplamalarla birlikte işlevde bir sözlük olarak geçirebiliriz :

grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
                                      'other_col_1': ['sum', 'count']})

# to flatten the multi-level columns
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]

# if you wish to reset the index
grp_df.reset_index(inplace=True)
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.