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

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

ただいまの
回答率

88.77%

Python pandas for文で複数回部分一致した行を取得したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 800

nekotarou

score 14

使用言語Python
現在for文を使用し、リストに格納されているデータの回数だけ処理を繰り返したいと考えています。
実行する処理として、リストの一つ目のデータとCSVファイルのデータフレーム'name'の内容と文字列が一部一致した行だけを取得し、
その後、取得した行から必要なデータを取得する。

次のループでは2つ目のデータでCSVファイルのデータフレーム'name'の内容と文字列が一部一致した行だけを取得・・・と繰り返したい。

以下例プログラム

import pandas as pd

csv_data=pd.read_table(~~~)
#csvファイルから読み込む

> ↓csvファイルの内容
>      name     ido       keido
> 1   北海道    xx.xx   xx.xxx
> 2   東京都    xx.xx    xx.xxx
> 3   青森県    xx.xx    xx.xxx
> 4   秋田県    xx.xx    xx.xxx
> 5     ・     ・     ・
> 6     ・         ・         ・
> 7     ・         ・         ・


list=['青森','大分','東京',・・・] #複数データがあると考えていただけると

for idokeido in list:
  csv_data2=csv_data[csv_data['name'].str.contains(idokeido)] 
    #↑listのデータとデータフレームnameが部分一致した行を抜き出したい
    data=csv_data2[['ido','keido']]
    #↑抜き出した行からidoとkeidoを取得
    print(data)


実行しても、思い通りのido,keidoを取得することできず困っております。
拙い文章でわかりにくいと思いますが、お力を貸していただけると恐縮です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2019/10/22 19:48

    何回か読み返してみましたが、正直なところ意図がよくわかりませんので、もう少し丁寧に説明していただくと良いと思います。
    また、コード部分はコードブロックのmarkdownを使用してください。

    キャンセル

回答 2

checkベストアンサー

+1

ほぼそのままですが、
出来てそうに見えるけど、問題は何だったのでしょう。

$cat in.csv 
name,ido,keido
北海道,11,55
東京都,22,66
青森県,33,77
秋田県,44,88
#!/usr/bin/env python3

import pandas as pd

csv_data = pd.read_csv('in.csv')

names = ['秋田', '東京']

for name in names:
  row = csv_data[csv_data['name'].str.contains(name)]
  data = row[['ido', 'keido']]
  print(data)
$ ./a.py 
   ido  keido
3   44     88
   ido  keido
1   22     66

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/23 09:03

    質問への解答ありがとうございます。

    tanishi_a様がおっしゃられていた通り、プログラムには問題がなく、
    どうやらCSVファイルが文字化けしており、うまく動作できていませんでした。
    現在はutf-8にエンコードして無事に動作することを確認いたしました。
    お騒がせして申し訳ありませんでした。
    迅速に自分のプログラムのミスがないか確かめていただきありがとうございました。

    迅速な対応をしていただいたtanishi_a様をベストアンサーに選ばせていただきます。

    キャンセル

+1

やりたいことを完全に理解できておりませんが、単に部分一致でデータを抜き出したいだけであれば、tanishi_aさんが書かれている通り、質問のコードで問題ないかと思います。

ただ、今回の質問のコードを見る限り DataFrame.groupby(name) にてループを回すので問題なさそうなのですが、それではなにか都合が悪いのでしょうか?(nameの末に'都道府県'以外の文字が含まれるということですか?)

import pandas as pd
import io

data = """
name,ido,keido
北海道,11,55
東京都,22,66
青森県,33,77
秋田県,44,88
"""

csv_data = pd.read_csv(io.StringIO(data))

for name, data in csv_data.groupby('name'):
    print(name)
    print(data.loc[:,['ido','keido']])

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/23 09:09

    質問への解答ありがとうございます。

    magichan様やtanishi_a様がおっしゃられていた通り、プログラムには問題がなく、
    どうやらCSVファイルが文字化けしており、うまく動作できていませんでした。
    現在はutf-8にエンコードして無事に動作することを確認いたしました。

    やりたいことがわかりにくく、色々とお騒がせして申し訳ありませんでした。
    また、別の記述方法まで教えていただきありがとうございます。
    今後の参考にさせていただきたいと思います。本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る