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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

2回答

1202閲覧

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

nekotarou

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

1クリップ

投稿2019/10/22 10:08

編集2019/10/22 11:21

使用言語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を取得することできず困っております。
拙い文章でわかりにくいと思いますが、お力を貸していただけると恐縮です。

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

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

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

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

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

hayataka2049

2019/10/22 10:48

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

回答2

0

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

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

Python

1import pandas as pd 2import io 3 4data = """ 5name,ido,keido 6北海道,11,55 7東京都,22,66 8青森県,33,77 9秋田県,44,88 10""" 11 12csv_data = pd.read_csv(io.StringIO(data)) 13 14for name, data in csv_data.groupby('name'): 15 print(name) 16 print(data.loc[:,['ido','keido']])

投稿2019/10/22 23:45

編集2019/10/22 23:56
magichan

総合スコア15898

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

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

nekotarou

2019/10/23 00:09

質問への解答ありがとうございます。 magichan様やtanishi_a様がおっしゃられていた通り、プログラムには問題がなく、 どうやらCSVファイルが文字化けしており、うまく動作できていませんでした。 現在はutf-8にエンコードして無事に動作することを確認いたしました。 やりたいことがわかりにくく、色々とお騒がせして申し訳ありませんでした。 また、別の記述方法まで教えていただきありがとうございます。 今後の参考にさせていただきたいと思います。本当にありがとうございました。
guest

0

ベストアンサー

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

text

1$cat in.csv 2name,ido,keido 3北海道,11,55 4東京都,22,66 5青森県,33,77 6秋田県,44,88

python

1#!/usr/bin/env python3 2 3import pandas as pd 4 5csv_data = pd.read_csv('in.csv') 6 7names = ['秋田', '東京'] 8 9for name in names: 10 row = csv_data[csv_data['name'].str.contains(name)] 11 data = row[['ido', 'keido']] 12 print(data) 13

text

1$ ./a.py 2 ido keido 33 44 88 4 ido keido 51 22 66

投稿2019/10/22 12:50

編集2019/10/22 12:51
tanishi_a

総合スコア484

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

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

nekotarou

2019/10/23 00:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問