45
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pandasのgroupbyでグループ化した文字列を結合する

Last updated at Posted at 2019-01-08

はじめに

データベースのデータを整理しているときに、文字列型のカラムに入っている値をグループごとに結合したい場面がありましたので、メモとして残しておきます。

参考

環境

  • Google Colabratory
  • pandas==0.22.0

手順

次のようなデータを考えます。

import pandas as pd

df = pd.DataFrame({
    'id':['1','2','2','2','3','3'],
    'tag':['a','a','b','v','s','j'],
    'value':['70','23','64','23','12','9']
    })

データフレームは下記の形になります。

id tag value
0 1 a 70
1 2 a 23
2 2 b 64
3 2 v 23
4 3 s 12
5 3 j 9

例えばidはユーザidで、tagは何らかの特徴を表す値、valueは支払い金額だとします。

ユーザごとグルーピングして支払い金額を集計しつつ、tagの値も残したいとします。
そこで、tagの値はアンダースコアで結合して残すことにします。

pandasでグループ化したのち、listをapplyすると、tagをリスト化してレコードに持つことができます。リストの中身をソートして、アンダースコアでjoinします。

result = (df.groupby('id')['tag']
          .apply(list)
          .apply(lambda x:sorted(x))
          .apply('_'.join)
         )

# 下記でもOK
# result = df.groupby('id')['tag'].apply(lambda x: '_'.join(sorted(list(x))))
# または
# result = df.groupby('id')['tag'].apply(lambda x: '%s' %
#                                        '_'.join(sorted(list(x)))).reset_index()

下記のように結合されます。

id tag
0 1 a
1 2 a_b_v
2 3 j_s

元のデータフレームと同じサイズにする場合。

result = df.groupby('id')['tag'].transform(lambda x: '_'.join(sorted(x.tolist())))

おわりに

文字列にもgroupbyを使用して操作できると思ってない人も結構いるんじゃないでしょうか。

45
28
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?