pandasでリストとして格納されている各要素を展開する
pandasに長さが等しいリストが格納されており、そのリストを展開して、それぞれ独立したカラムする方法をメモしておきます。
github
- jupyter notebook形式のファイルはこちら
google colaboratory
- google colaboratory で実行する場合はこちら
筆者の環境
筆者のOSはmacOSです。LinuxやUnixのコマンドとはオプションが異なります。
!sw_vers
ProductName: macOS
ProductVersion: 13.5.1
BuildVersion: 22G90
!python -V
Python 3.9.17
基本的なライブラリをインポートしそのバージョンを確認しておきます。
%matplotlib inline
import pandas as pd
print('pandas version :', pd.__version__)
pandas version : 2.0.3
サンプルデータの準備
df = pd.DataFrame(
{
"user_id": ["A", "B", "C"],
"item_id": [["PC", "Book"], ["Book", "Table"], ["Desk", "CD"]],
}
)
df.head()
user_id | item_id | |
---|---|---|
0 | A | [PC, Book] |
1 | B | [Book, Table] |
2 | C | [Desk, CD] |
結論
展開したいカラムをpd.Series
を引数にapplyを適用します。
item_id
カラムに対して適用し、適当にカラム名を設定します。
df.item_id.apply(pd.Series).set_axis(["col1", "col2"], axis=1)
col1 | col2 | |
---|---|---|
0 | PC | Book |
1 | Book | Table |
2 | Desk | CD |
必要なカラムだけに適用したいので、pop
とjoin
を利用します。
df.join(df.pop("item_id").apply(pd.Series).set_axis(["col1", "col2"], axis=1))
user_id | col1 | col2 | |
---|---|---|---|
0 | A | PC | Book |
1 | B | Book | Table |
2 | C | Desk | CD |
想定通りのDataFrameができました。