質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1016閲覧

Seriesの文字列を内包表記で加工してみたい

okahijiki

総合スコア404

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/04/26 08:22

Seriesの文字列の文字を、内包表記により加工したいのですけれど、イメージ通りにいきません。ご教示のほど、よろしくお願いいたします。

python

1import pandas as pd 2foods = pd.Series(['イチジク','ニンジン','サンショ','シイタケ','ゴボウ']) 3foods 4 50 イチジク 61 ニンジン 72 サンショ 83 シイタケ 94 ゴボウ 10 11 12 13 14delate = ['ジク','ンジン','ショ','イタケ','ボウ'] 15 16for i in delate: 17 foods=foods.str.replace(i,'') 18 19print(foods) 200 イチ 211222 サン 23324425[dtype: object] 26 27# 上記のfor文により出力されたものを、内包表記にて、やってみたいと思い、以下のように書いてみました。 28# がしかし、以下の通り、5回繰り返されてしまいます汗) 29 30count=[foods.str.replace(i,'')for i in delate] 31print(count) 32 33[0 イチ 341352 サン 36337438dtype: object, 0 イチ 391402 サン 41342443dtype: object, 0 イチ 441452 サン 46347448dtype: object, 0 イチ 491502 サン 51352453dtype: object, 0 イチ 541552 サン 56357458[dtype: object] 59 60# 以下のようにすれば、たしかに、目標通りになるのですが.. 61# そうではなく、内包表記一発で、以下のような結果にしたいのです。 62 63print(count[0]) 64 650 イチ 661672 サン 68369470dtype: object 71 72 73 74◎やってみたこと 75count=[foods = foods.str.replace(i,'')for i in delate] 76 77File "<ipython-input-30-635c7c8e453b>", line 1 78 count=[foods = foods.str.replace(i,'')for i in delate] 79 ^ 80SyntaxError: invalid syntax

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

meg_ さんが書かれている通り、この処理を行う為に 内包表記は向いておりません。

Series.str.replace() の代わりに Series.replace() を使用すると 第一引数に Listを取ることができますので、そちらで代用するのはいかがでしょうか。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.replace.html

Python

1import pandas as pd 2foods = pd.Series(['イチジク','ニンジン','サンショ','シイタケ','ゴボウ']) 3delate = ['ジク','ンジン','ショ','イタケ','ボウ'] 4ret = foods.replace(delate, '', regex=True) 5print(ret) 6#0 イチ 7#1 ニ 8#2 サン 9#3 シ 10#4 ゴ 11#dtype: object

どうしても Series.str.replace()を使うのであれば、正規表現にて 'or' 表記を使う方法もあります。

Python

1delate = ['ジク','ンジン','ショ','イタケ','ボウ'] 2ret = foods.str.replace('|'.join(delate), '', regex=True) 3print(ret) 4#0 イチ 5#1 ニ 6#2 サン 7#3 シ 8#4 ゴ

投稿2020/04/26 09:03

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

okahijiki

2020/04/26 09:25

Series.replaceにて、イメージどおりにできましたー。 Seriesにも、replaceがあるのですね〜 Seriesの場合は、str.replace( )、 (ちょっとへんな言い方ですが)通常のpythonの場合は、 replace( )というふうに、 使い分けるとばかり思っていました汗) 貼っていただいた、Series,replace( )のチュートリアル、がんばってチェックしたいと存じます。 Series.str.replace & 正規表現の方も、バッチシ、うまくいきました。 ただし、こちらの方は、教えていただいた通り、そのまま打った感じでありまして。 正規表現については、これからの宿題とさせて下さいませ。 末筆になりましたが、ありがとうございましたー。
guest

0

Python

1import pandas as pd 2 3foods = pd.Series(['イチジク','ニンジン','サンショ','シイタケ','ゴボウ']) 4delate = ['ジク','ンジン','ショ','イタケ','ボウ'] 5count=[foods.str.replace(i,'') for i in delate] 6print(count)

上記コードの実行結果は下記です。

[0 イチ 1 ニンジン 2 サンショ 3 シイタケ 4 ゴボウ dtype: object, 0 イチジク 1 ニ 2 サンショ 3 シイタケ 4 ゴボウ dtype: object, 0 イチジク 1 ニンジン 2 サン 3 シイタケ 4 ゴボウ dtype: object, 0 イチジク 1 ニンジン 2 サンショ 3 シ 4 ゴボウ dtype: object, 0 イチジク 1 ニンジン 2 サンショ 3 シイタケ 4 ゴ dtype: object]

内包表記内ではfoodsそのものは更新されていないこと、各処理で文字列処理しているのはdelateの1要素のみであることにより上記の結果となります。
今回の処理においては内包表記は向いていないではないかと思います。

投稿2020/04/26 08:33

meg_

総合スコア10605

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

okahijiki

2020/04/26 08:40

meg_さま 先の質問と併せて、ご回答ありがとうございます。内容表記の条件について、承知しました。 お手数をおかけします。このケースの場合で、加工した文字を、変数に入れることは可能なのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問