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

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

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

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

Q&A

解決済

1回答

2778閲覧

pandasで列、行数が異なる2つのcsvファイルから、一致するデータを取り出す

lokoloko

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/12/22 01:09

前提・実現したいこと

pandasを使って列と行数が異なる以下のような2つのcsvファイルから一致するデータを取り出すという作業を行う中でエラーが発生しました。

以下の場合だと、data.csv内の都道府県名の列をsamp_address.csvの都道府県の列と比較して、一致すると出力を行いたいのですが、書いたコードだとうまく動きませんでした。

この場合、どのようにすれば解決できますでしょうか?


data.csv
A 111 ok 東京都
B 222 ok 福岡県
C 333 ok 神奈川県
D 444 NG 北海道

samp_address.csv
団体コード 都道府県名(漢字)
10006 北海道
130001 東京都
470007 沖縄県


発生している問題・エラーメッセージ

Traceback (most recent call last): File "/Users/aaaaa/bbbbb/test/cccccccc/APPS/sample2.py", line 11, in <module> print(df[df.query('address.str.contains(@address)')]) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/frame.py", line 4060, in query res = self.eval(expr, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/frame.py", line 4191, in eval return _eval(expr, inplace=inplace, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/eval.py", line 348, in eval parsed_expr = Expr(expr, engine=engine, parser=parser, env=env) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 806, in __init__ self.terms = self.parse() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 825, in parse return self._visitor.visit(self.expr) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 411, in visit return visitor(node, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 417, in visit_Module return self.visit(expr, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 411, in visit return visitor(node, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 420, in visit_Expr return self.visit(node.value, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 411, in visit return visitor(node, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/computation/expr.py", line 705, in visit_Call return self.const_type(res(*new_args, **kwargs), self.env) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/strings/accessor.py", line 116, in wrapper return func(self, *args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/strings/accessor.py", line 1153, in contains if regex and re.compile(pat).groups: File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py", line 251, in compile return _compile(pattern, flags) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py", line 293, in _compile return _cache[type(pattern), pattern, flags] TypeError: unhashable type: 'DataFrame'

該当のソースコード

# # -*- coding: utf-8 -*- import pandas as pd #data.csvの呼び出し df = pd.read_csv('data.csv',names=["name","ID","check","address"]) # samp_address.csvの呼び出し address = pd.read_csv("samp_address.csv", usecols=[1]) # data内にaddress要素があれば抽出 print(df[df.query('address.str.contains(@address)')])

試したこと

isin()も試してみたのですが、
Empty DataFrame
Columns: [name, ID, check, address]
Index: []
となりました。

補足情報(FW/ツールのバージョンなど)

実際に使用している2つのcsvファイルはもっと大きいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

普通は、pandas.mergeを使ったあとで、必要なところだけ取り出します。

python

1>>> print(df) 2 name ID check address 30 A 111 ok 東京都 41 B 222 ok 福岡県 52 C 333 ok 神奈川県 63 D 444 NG 北海道 7>>> print(address) 8 都道府県名(漢字) 90 北海道 101 東京都 112 沖縄県 12>>> 13>>> pd.merge(df, address, left_on = 'address', right_on='都道府県名(漢字)') 14 name ID check address 都道府県名(漢字) 150 A 111 ok 東京都 東京都 161 D 444 NG 北海道 北海道

参考

pandas.DataFrameを結合するmerge, join(列・インデックス基準)

投稿2021/12/22 01:27

ppaul

総合スコア24666

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

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

lokoloko

2021/12/22 01:41

回答ありがとうございます! うまくいけました!!
lokoloko

2021/12/22 01:54

ちなみになのですが、left_onで設定したaddress内が、「北海道旅行に行ったよー」のような文章になっていて部分一致したものを取り出したい場合、right_onはどのように設定した方がいいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問