改行(またはその他の区切り文字)で行を分割したい
元となるDataFrameは
id name
0 1 あい\nうえお
1 2 かきくけこ
2 3 サシスセソ
このようなもので、このnameの値を改行コードで分割する。
id name line_number
0 1 あい 1
1 1 うえお 2
2 2 かきくけこ 1
3 3 サシスセソ 1
このようにid=1
の行を2つに分割し、先頭から1,2... と行番号をつけていく処理をしたかった。
コード
split.py
import pandas as pd
import numpy as np
import re
df = pd.DataFrame(
data={
'id': [1, 2, 3],
'name': ['あい\nうえお', 'かきくけこ', 'サシスセソ']
}
)
df["name"] = df['name'].str.split(pat="\n") # 改行コードでレコードを配列化
df = df.explode('name', ignore_index=True) # explodeで配列を行に分割
df['group_id'] = df.groupby(['id']).ngroup() # グループ毎にIDを降る
df['original_index'] = df.index # 一行ずつにindexを設定
df["line_number"] = df.groupby(["id"])["original_index"].rank(ascending=True) #グループ内で上の業からrank付けをしていく
df['line_number'] = df['line_number'].astype(np.int64) #float型で入っているのでintに直す
df = df.drop('original_index', axis=1) # 生成過程の不要な列を削除
df = df.drop('group_id', axis=1) # 生成過程の不要な列を削除
print(df)
処理は各行にコメントを付けた通り。
ただ結構回りくどい処理をしているのでもっとスッキリできるやり方があれば教えていただきたいです。