Pythonのメモ帳

numpy, pandas, tensorflow を使いこなすための忘備録

pandas / DataFrame の中身の文字列を一括で分割して別の列として定義する

pandasで、特定の列の(中身の)文字列を分割して使いたいときがある。

 

例えばこんな表があったとして、

 
NumName
0 a001_name1
1 a002_name2
2 a003_name3

 ↓  こんな風にしたい

 
NumName
num
name
0 a001_name1 a001 name1
1 a002_name2 a002 name2
2 a003_name3 a003 name3

 

この処理をするのに、以前はこんなもっさりしたコードを書いていた。

分割したい列の中身を取り出して、1行ずつ分割処理するやり方だ。

vals  = df['NumName'].values
nums  = []
names = []

for val in vals: num,name = val.split('_') nums.append(num) names.append(name) df['num'] = nums df['name'] = names

 

でも下のようにたった2行で書けることがわかった。

df['num']  = df['NumName'].str.split(pat='_', expand=True)[0]
df['name'] = df['NumName'].str.split(pat='_', expand=True)[1]

for を使わないので処理速度も上がるかもしれない。(pandasが裏で効率よくやってくれているはず) 

pandas公式ページ参照:
 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.split.html

 

 ちなみ1行目にある .str が便利なやつで、これを使うと文字列の処理を列単位で一括でやってくれる。文字列操作 replace() もご覧の通り。

df['NumPlace'] = df['NumName'].str.replace('name','place')
 
NumName
num
name
NumPlace
0 a001_name1 a001 name1 a001_place1
1 a002_name2 a002 name2 a002_place2
2 a003_name3 a003 name3 a003_place3

 pandasのおかげで本当に仕事がはかどる。