パンダ数(個別)相当


289

複数のデータベース(oracle、mssqlなど)があり、コマンドのシーケンスを同等のSQLにすることができないため、pandasをdbの代替として使用しています。

いくつかの列を持つデータフレームに読み込まれたテーブルがあります。

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

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

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

そして結果は

201301    5000
201302    13245

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


私はtable.groupby(['YEARMONTH'])['CLIENTCODE']。unique()を実行し、YEARMONTHでインデックス付けされた2つのシリーズとすべての一意の値が付属しています。各シリーズの値の量を数える方法は?
アドリアーノアルメイダ

いくつかのために、value_counts:あなたが探している答えかもしれませんpandas.pydata.org/pandas-docs/stable/generated/...
sachinruk

回答:


434

私はこれがあなたが望むものだと信じています:

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

2
.drop_duplicates(subset = ['col1'、 'col2'])のように、一緒に一意にしたい複数の列がある場合はどうなりますか?
ErnestScribbler 2017年

4
この一意のカウントにアクセスする方法。何の列名が存在しないため
タルンKhaneja

おかげで、私はリサンプルの出力にこのスタイルを使用しました。df_watch_record.resample( 'M')。user.nunique()は、毎月​​映画を視聴したユニークユーザーの数をカウントします。
Mehdi Kazemi

1
そして、それらをtable.groupby( 'YEARMONTH')。CLIENTCODE.nunique()。sort_values(ascending = False)で並べ替えます
wllbll

後にグループ識別子を取得することは可能nuniqueですか?この回答の結果があるので、私は、道を見つけることができない可能性があるとして試してみてくださいSeries、ではありませんDataFrame
Josh Hansen、

93

これは別の方法で、非常に単純です。データフレーム名がでdaat、列名がYEARMONTH

daat.YEARMONTH.value_counts()

1
私はこの答えが好きです。列名に「。」が含まれている場合、このメソッドをどのように使用できますか?その中に(例えば「ck.Class」)?ありがとう

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

28
これは、尋ねられた質問には対応していません。
アーロンシューマッハ

6
これは、各グループ内の観測数をカウントするものであり、各グループが持つ特定の列の一意の値ではありません。
Jasonゴール

2
これは不正解です。DISTINCT質問からの要件を反映していません!また、NaN!の数は含まれません。
Corey Levinson

47

興味深いことに、非常に頻繁にlen(unique())は数倍(3x-15x)高速ですnunique()


11
あなたはこれを意味しますか?.CLIENTCODE.apply(lambda x: len(x.unique()))、からここに
user4015990

6
@ user32185 applyラムダを使用して呼び出しにドロップする必要があります。例えば、df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0])
3novak

3
構文は完全に明確ではありません。len(df['column'].unique())ラムダ関数は必要ありませんでした
mlh351

私はコメントTypeError: object of type 'method' has no len()から得た、私のためChen's3novak's働いた。
Jasonゴール

4

を使用すると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

これを2列YEARMONTHととしてエクスポートするにはどうすればよいですかcount。また、降順でカウントを設定できますか?
Murtaza Haji

3

私も使用して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

新しいパンダバージョンでは、データフレームとして簡単に取得できます

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

0

ここでは、複数の列でカウントを区別する方法を示します。いくつかのデータを見てみましょう:

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

次に、目的の列をリストし、わずかに変更した構文でgroupbyを使用します。

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

私達は手に入れました:

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

0

他の列の集計と列の区別

CLIENTCODEあなたの場合)任意の列の異なる数の値を取得するには、を使用できますnuniqueagg他の列の集計とともに、関数内の辞書として入力を渡すことができます。

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