python – pandas groupbyで文字列をリスト化
業務を行なっているとdata lakeから直接データ取得しなければならない場合があると思います。そのため、前処理などで大量データをpandasで処理する機会が非常に多いように思います。
そこで今回は、少し利用頻度は低いですが、最近使用したpython codeの中でpandasのgroup by構文で文字列をリスト化した時のことを記録しようと思います。
基本的なpandasでのgroupbyについては以下の記事をご参考ください。
1. 前処理
データセットを作成します。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6],'c':[3,3,3,4,4,4]})
...: df
Out[2]:
a b c
0 A 1 3
1 A 2 3
2 B 5 3
3 B 5 4
4 B 4 4
5 C 6 4
2. 単一カラムをpandasでgroup by時にリスト化
それでは、pandasを使用の上、カラム”a”をkeyに、カラム”b”をgroup by時にリスト化していきます。
In [3]: df.groupby('a')['b'].apply(list)
Out[3]:
a
A [1, 2]
B [5, 5, 4]
C [6]
Name: b, dtype: object
In [4]: df.groupby('a')['b'].apply(list).reset_index()
Out[4]:
a b
0 A [1, 2]
1 B [5, 5, 4]
2 C [6]
通常のgroupby構文にapplyとlistを使用するだけで、簡単に結果が取得できました。もう一つ別の方法として、lambda関数を使用する方法もメモしておきます。
In [3]: df.groupby('a')['b'].agg(lambda x: list(x))
Out[3]:
a
A [1, 2]
B [5, 5, 4]
C [6]
Name: b, dtype: object
In [4]: df.groupby('a')['b'].agg(lambda x: list(x)).reset_index()
Out[4]:
a b
0 A [1, 2]
1 B [5, 5, 4]
2 C [6]
agg関数とlambdaを使用することで簡単に結果が取得できました。私はこちらの方法を多用しています。
次にリスト形式でなく文字列連結のパターンも使用する機会があったので、メモしておきます。
col: bをstringにcastして、カンマで文字列連結してみます。
In [5]: df['b'] = df['b'].astype(str)
In [6]: df.groupby('a')['b'].apply(', '.join)
Out[6]:
a b
0 A 1, 2
1 B 5, 5, 4
2 C 6
3. 複数カラムをpandasでgroup by時にリスト化
では、複数カラムに対して1レコードにリスト化を行ってみます。
In [7]: df.groupby('a').agg(lambda x: list(x))
Out[7]:
b c
a
A [1, 2] [3, 3]
B [5, 5, 4] [3, 4, 4]
C [6] [4]
In [8]: df.groupby('a').agg(lambda x: list(x)).reset_index()
Out[8]:
a b c
0 A [1, 2] [3, 3]
1 B [5, 5, 4] [3, 4, 4]
2 C [6] [4]
最後に、カンマで文字列連結も行ってみます。事前にカラム”c”をString型にキャストしてから、groupbyでlistをカンマ区切りに変換していきます。
In [9]: df['c'] = df['c'].astype(str)
In [10]: df.groupby('a').agg(lambda x: ', '.join(sorted(list(x)))).reset_index()
Out[10]:
a b c
0 A 1, 2 3, 3
1 B 4, 5, 5 3, 4, 4
2 C 6 4
4. まとめ
ということで、今回はpython codeの中でpandasのgroup by構文で文字列をリスト化したときのことをメモしてみました。非常に簡単にpythonでpandasのgroup by構文で文字列をリスト化できたのではないかと思います。