web-dev-qa-db-ja.com

パンダ数(個別の)等価物

複数のデータベース(Oracle、mssqlなど)があるため、データベースの代替としてパンダを使用していますが、SQLと同等の一連のコマンドを作成できません。

いくつかの列を持つDataFrameにロードされたテーブルがあります。

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

SQLでは、1年あたりのさまざまなクライアントの数を数えると、次のようになります。

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

そして結果は

201301    5000
201302    13245

パンダでどうすればいいの?

199
Adriano Almeida

私はこれがあなたが望むものであると信じます:

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

例:

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
322
Dan Allan

これは非常に簡単なもう1つの方法です。データフレーム名はdaat、列名はYEARMONTHです。

daat.YEARMONTH.value_counts()
61
Enthusiast

非常に興味深いことに、len(unique())nunique()より数倍速い(3倍から15倍)のが普通です。

36
Roman Kh

crosstabを使用すると、これはgroupbynuniqueより多くの情報を返します。

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

少し修正した後、結果を出す

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

おそらくこれはあなたの要求に最適です。

print(YEARMONTH['CLIENTCODE'].unique())

gROUPBYは

print(YEARMONTH.groupby('CLIENTCODE').size())
0
N. Puri

私はnuniqueも使用していますが、'min', 'max', 'count' or 'mean'などの集約関数を使用する必要がある場合に非常に役立ちます。

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
Gangaraju