たったワンライナーでPandas Series型をDataFrame型に変換する【Python tips】

Python

 

こんにちは、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による自然言語処理超入門】

続く……

 

コメント

タイトルとURLをコピーしました