こんにちは、monachan_papaです。
過日、Pandas Series型をDataFrame型に変換する際、かなり面倒くさいことをやってしまったスットコドッコイです。
けれども何と!面倒くさくない楽な方法に辿り着いた。
そんなことで、今回はtips的に紹介したいと思います。
想定シーン
以下のようなデータフレームがあり、項目ごとの要素数をDataFrame型で取得したいシーンがあったとします。
import pandas as pd
df = pd.DataFrame({'NAME': ['マーサ', 'マーサ', 'マーサ', '駒子', '駒子', 'あずき']})
df
NAME | |
---|---|
0 | マーサ |
1 | マーサ |
2 | マーサ |
3 | 駒子 |
4 | 駒子 |
5 | あずき |
このとき、項目ごとの要素数は、value_countsメソッドで取得することができます。
しかし、当然 Series型で返ってきます。
datas = df['NAME'].value_counts()
datas
マーサ 3
駒子 2
あずき 1
Name: NAME, dtype: int64
type(datas)
pandas.core.series.Series
そこで、安直に以下のようなことをやりたくなりますが、当然期待する結果にはなりません。
NAME列に要素数が入っとるわ、こらあかん。
激おこぷんぷん丸!
pd.DataFrame(datas)
NAME | |
---|---|
マーサ | 3 |
駒子 | 2 |
あずき | 1 |
解決策
解決策として、自分が思う一番楽な方法を示します。
ワンライナーで書けます!
pd.DataFrame({'NAME': datas.index, 'COUNT': datas.values})
NAME | COUNT | |
---|---|---|
0 | マーサ | 3 |
1 | 駒子 | 2 |
2 | あずき | 1 |
爽快ですね!!
さて、そもそも変数datasの中身はこうなっていました。
datas
マーサ 3
駒子 2
あずき 1
Name: NAME, dtype: int64
マーサ、駒子、あずきはインデックスなのでこれを参照してデータフレームのNAME列にあてれば良いだけなんです。
インデックスの参照は、Series型.index で一発です。
datas.index
Index(['マーサ', '駒子', 'あずき'], dtype='object')
そして、COUNT列も一発です。Series型.values を使います。
datas.values
array([3, 2, 1])
とまぁ、こんなに楽にできてしまいます。
前回の共起ネットワークの記事で、Series型からDataFrame型にするシーンがあったのですが、何だか面倒くさくて楽じゃない方法でやっていました。楽でない方法も知りたい奇特な御仁は是非、そちらもご覧ください!
betenya駒子さん作詞『恋の鶴舞線』を共起ネットワークで可視化してみた【Pythonによる自然言語処理超入門】
続く……
コメント