u++の備忘録

「カンマ区切りで複数要素が入った列」をpandasで集計

本記事では、「カンマ区切りで複数要素が入った列」をpandasで集計する方法を紹介します。

「カンマ区切りで複数要素が入った列」とは、下記のような状況です。例えばアンケートの複数選択可の回答などで、行ごとに含まれる要素数も異なる場合が考えられます。

import pandas as pd
df = pd.DataFrame({'s': ['X,Y,Z', 'X', 'X,Y', 'X,Y,Z']},
                  index=['a', 'b', 'c', 'd'])
df

f:id:upura:20190123233331p:plain

文字列のまま部分一致で処理する方法もありますが、集計が目的の場合は、各行の要素をまとめて一つのリストに格納してしまうのが手っ取り早いと思います。

まずは各行の要素をリストに変換します。

df['l'] = df['s'].str.split(',')
df

f:id:upura:20190123233938p:plain

そして、sum()関数で足し合わせます。

ans = sum(df['l'], [])
ans
['X', 'Y', 'Z', 'X', 'X', 'Y', 'X', 'Y', 'Z']

あまり馴染みがないかもしれませんが、sum()の第2引数は、足し合わせの初期値です。指定がない場合は0なので、普段はあまり意識しない引数です。

今回の場合は、初期値の空のリストに、各要素のリストを次々と足し合わせる処理となります。最終的には、全ての要素が格納された一つのリストが得られるといった具合です。

こうなってしまえば、あとはollections.Counter()を使って簡単に集計が可能です。

import collections
c = collections.Counter(ans)
c
Counter({'X': 4, 'Y': 3, 'Z': 2})

短いですが、本記事では「カンマ区切りで複数要素が入った列」をpandasで集計する方法を紹介しました。

実装はGitHubで公開しました。

github.com