web-dev-qa-db-ja.com

2つの列でグループ化し、pandas

次のデータフレームがあります。

data = pd.DataFrame({'user_id' : ['a1', 'a1', 'a1', 'a2','a2','a2','a3','a3','a3'], 'product_id' : ['p1','p1','p2','p1','p1','p1','p2','p2','p3']})

product_id  user_id
    p1       a1
    p1       a1
    p2       a1
    p1       a2
    p1       a2
    p1       a2
    p2       a3
    p2       a3
    p3       a3

実際には他にもいくつかの列があるかもしれませんが、product_idとuser_idの列でデータフレームごとにグループ化し、各組み合わせの数をカウントして、新しいデータフレームに新しい列として追加する必要があります。

出力は次のようになります。

user_id product_id  count
a1       p1            2
a1       p2            1
a2       p1            3
a3       p2            2
a3       p3            1

私は次のコードを試しました:

grouped=data.groupby(['user_id','product_id']).count()

しかし結果は:

user_id product_id
 a1       p1
          p2
 a2       p1
 a3       p2
          p3

実際に私にとって最も重要なことは、発生数を含む列名のカウントを持つことです。後で列を使用する必要があります。

11
chessosapiens

たぶんこれがあなたの望みですか?

>>> data = pd.DataFrame({'user_id' : ['a1', 'a1', 'a1', 'a2','a2','a2','a3','a3','a3'], 'product_id' : ['p1','p1','p2','p1','p1','p1','p2','p2','p3']})
>>> count_series = data.groupby(['user_id', 'product_id']).size()
>>> count_series
user_id  product_id
a1       p1            2
         p2            1
a2       p1            3
a3       p2            2
         p3            1
dtype: int64
>>> new_df = count_series.to_frame(name = 'size').reset_index()
>>> new_df
  user_id product_id  size
0      a1         p1     2
1      a1         p2     1
2      a2         p1     3
3      a3         p2     2
4      a3         p3     1
>>> new_df['size']
0    2
1    1
2    3
3    2
4    1
Name: size, dtype: int64
16
Nehal J Wani

結果を組み合わせて別の列を作成する場合は、@ Nehalの応答を少し作成します。

product_id列とsize列を組み合わせることができます。

new_df['combo'] = new_df['product_id'].map(str) + '(' + new_df['size'].map(str) +')'

...さらにgroupbyを使用して、「user_id」で列を整理します

new_df['combo'].astype(str).groupby(new_df['userid']).agg(['size',', '.join])
0
sparrow