複数のデータベース(Oracle、mssqlなど)があるため、データベースの代替としてパンダを使用していますが、SQLと同等の一連のコマンドを作成できません。
いくつかの列を持つDataFrameにロードされたテーブルがあります。
YEARMONTH, CLIENTCODE, SIZE, .... etc etc
SQLでは、1年あたりのさまざまなクライアントの数を数えると、次のようになります。
SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;
そして結果は
201301 5000
201302 13245
パンダでどうすればいいの?
私はこれがあなたが望むものであると信じます:
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
これは非常に簡単なもう1つの方法です。データフレーム名はdaat
、列名はYEARMONTH
です。
daat.YEARMONTH.value_counts()
非常に興味深いことに、len(unique())
はnunique()
より数倍速い(3倍から15倍)のが普通です。
crosstab
を使用すると、これはgroupby
nunique
より多くの情報を返します。
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
おそらくこれはあなたの要求に最適です。
print(YEARMONTH['CLIENTCODE'].unique())
gROUPBYは
print(YEARMONTH.groupby('CLIENTCODE').size())
私は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