@hayato0522 (hayato)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonのdataframe中の文章から特定の文字位置から特定の文字位置までの抽出方法

Q&A

Closed

解決したいこと

pytnonのpandasデータフレームにおいて文章から特定の位置の単語を抜き出したいです。

例)
例として以下のデータフレームを考えます。
ここで、新しい列を作成してそこに生き物の名前だけを入れることが目的です。
例えば1行目なら”あめんぼ”という文字を抽出したいのです。


df = pd.DataFrame(
    data={'列1': [1, 2, 3], 
          '列2': ["生き物:あめんぼ、色:黒", "生き物:犬、色:茶色", "生き物:トンボ、色:赤"]}
)

image.png

以下のように一行だけならfind関数で抽出できるのでこれをfor文で各行に適用すれば一応できますが、デーフレームを一括で変換させた方が処理としては軽いような気がして、for文を使わずに
df["列3"]=df["列2"].〇〇
みたいな感じで処理したいと思っています。

#方法1
#一行ならfind関数で対応できるためこれをfor文で回す(処理時間かかりそう?)
s=df.iloc[0,1]
target = "生き物: "
target2="、色"
idx = s.find(target)
idx2=s.find(target2)
r = s[idx+5:idx2] 
r

自分で試したこと

DataFrameに対して.str[int:int]で特定の位置は指定できると知りましたが、各行で文字数が違うと使えません
文字で指定できないかと思い
df["列2"].str["生き物:":"、色"]
とかにするとNaNが出力されてしまいました。
分かりにくくてすみませんがよろしくお願いいたします。

df["列2"].str[4:8]
0 likes

2Answer

pandasでは正規表現を使って特定の文字列を抽出することができます。

df["列2"].str.extract(r"生き物:(.+)、色")
0
0 あめんぼ
1
2 トンボ
応用例
df["列2"].str.extract(r"生き物:(?P<生き物>.+)、色:(?P<色>.+)")
生き物
0 あめんぼ
1 茶色
2 トンボ
2Like

Comments

  1. @hayato0522

    Questioner

    ありがとうございます!
    結構簡単にできちゃうんですね!
    試してみます!(ㅅ´꒳` )

df["列3"]=df["列2"].〇〇 みたいな感じで

置換はあるのかな?

re.search() みたいな感じで!

 但し、str.contains()はre.search()と異なり検索位置、長さを返しません。dfが返されます。

1Like

Comments

  1. @hayato0522

    Questioner

    ありがとうございます!
    記事読みながら試してみます!(ㅅ´꒳` )

Your answer might help someone💌