python – pandas groupbyで文字列をリスト化

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構文で文字列をリスト化できたのではないかと思います。

(Visited 3,549 times, 6 visits today)