1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【pandas】DataFrameであるカラムを改行文字で分割して行番号をつける

Posted at

改行(またはその他の区切り文字)で行を分割したい

元となる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)

処理は各行にコメントを付けた通り。
ただ結構回りくどい処理をしているのでもっとスッキリできるやり方があれば教えていただきたいです。

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?