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

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

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

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

Q&A

解決済

2回答

1740閲覧

【Python】filterによる条件に一致するデータ抽出について

essa

総合スコア81

Python

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

0グッド

0クリップ

投稿2018/11/16 07:12

編集2018/11/16 07:43

条件に一致するデータ抽出について質問させてください。

参考にしているサイトは下記です。
https://python.civic-apps.com/map-reduce-filter/

「filter:条件に一致する要素のみ抽出する」

以下のようなコードとなっています(転載させていただきます)

python

1filter(lambda n:n%2==1, items) #lambda関数がTrueを返す要素(奇数)要素のみ抽出する 2[1, 2, 3] 3[x for x in items if x%2==1] #同じ事をリスト内包表記で。(最適な方法) 4[1, 3]

条件としている部分をリストにして、
リスト内の値と一つでも一致するなら抽出する。ということをしたいです。

all()関数を使えば実現可能かと思ったのですが、できませんでした。

ご存知のかたがいましたら、教えていただけるとありがたいです。

どうぞよろしくお願いいたします。

=======================
下記追記です。

コードは下記の様な感じです。

Python

1# -*- coding: utf-8 -*- 2import pandas as pd 3import csv 4import sys 5code = pd.read_csv("ほげほげ.csv",engine='python',encoding='utf-8') 6codelist = code.values.tolist() 7codelist = [ flatten for inner in kcl for flatten in inner ] 8 9with open("ほげほげ書き込み.csv",encoding='utf-8',errors='ignore') as f: 10 reader = csv.reader(f) 11 header = next(reader) 12 rows = [row for row in reader] 13 14with open("hogehogehoge.csv", "w", encoding='utf-8') as f: 15 writer = csv.writer(f, lineterminator = "\r\n") 16 writer.writerow(header) 17 nrows = list(filter(lambda row: row[10] == codelist, rows)) 18 writer.writerows(nrows)

下から二行目の部分のrow[10]とcodelistが一致しているもののみ、nrowsに代入したいと考えています。

#######################
更に追記
#######################

ほげほげ.csvが以下です。

品物 A(row[0]) B(row[1]) C(row[2]) あ 111 222 333 い 111 222 333 う 111 222 333 え 111 222 333 お 111 222 333 か 111 222 333 き 111 222 333 く 111 222 333 け 111 222 333 こ 111 222 333 さ 111 222 333 し 111 222 333

ほげほげ書き込み.csvが以下です。

Z 111 222 333 111 222 333 111 222 333 111 222 333

例えばこの場合、AとZを比較します。
そうなると、品物の「あ」「え」「き」「こ」
が抽出できる
というような感じです。

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

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

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

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

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

tiitoi

2018/11/16 07:15

入力とフィルタ後の期待する出力の例を記載いただけますか?
essa

2018/11/16 07:30

コードを追記しました。  入力例と出力例ですが、入力はCSV フィルタに使用するリストもCSV 出力もCSVです。
tiitoi

2018/11/16 07:37 編集

ほげほげ.csv と ほげほげ書き込み.csv の中身を先頭10行とかだけでもいいので、追記できますか?
essa

2018/11/16 07:43

csvファイルの中身を書きました。ご確認いただければ幸いです。
tiitoi

2018/11/16 07:54

pandas 使うなら、pandas の機能で条件を満たす行を抽出すればよいかと思いますが、それでは駄目なのでしょうか?回答のほうに追記しました。
essa

2018/11/16 08:08

回答ありがとうございます。自分がpandasの機能を知らなかったので、使っていませんでした。ありがとうございます。実行してみたところ、「ValueError: Can only compare identically-labeled Series objects」というエラーがでてしまいました。ちなみにtypeを確認したところ、どちらも<class 'pandas.core.frame.DataFrame'>でした。
tiitoi

2018/11/16 08:15

想定している data.csv と hoge.csv を回答欄に追記しました。
essa

2018/11/16 08:31

dataとhogeの行数は異なっています。異なった場合はエラーは起こり得るでしょうか?
essa

2018/11/16 08:31

行数ではなく、列数でした。列数が異なっています。
tiitoi

2018/11/16 08:51 編集

data.csv は A, B, C の3列あり、hoge は Z の1列ありますね。そして、data.csv のうち、A列の値がZ列と一致する行を抽出するという認識なのですが、そうではないのでしょうか?回答に記載したCSVと同じであれば、エラーにならないはずです。
essa

2018/11/16 09:24

質問が適切でなかったかもしれません。申し訳ありません。もう一度整理して質問したいと思います。
guest

回答2

0

ベストアンサー

質問の意図を誤解していたらすみません。
条件判定をする関数をリスト化してチェックすればよいのではないでしょうか?

python

1# 条件一覧 2cond1 = lambda x: x % 2 == 0 # 2の倍数 3cond2 = lambda x: x % 3 == 0 # 3の倍数 4cond3 = lambda x: x > 10 # 10より大きい 5conds = [cond1, cond2, cond3] 6 7# 入力 8lst = list(range(30)) 9 10# 出力 11filtered = list(filter(lambda x: all([cond(x) for cond in conds]), lst)) 12print(filtered) # [12, 18, 24]

データが大量にあるなら、速度的な面で numpy 使ったほうがよいと思います。

python

1import numpy as np 2 3# 入力 4lst = np.arange(30) 5 6# 出力 7filtered = lst[(lst % 2 == 0) & (lst % 3 == 0) & (lst > 10)] 8print(filtered) # [12, 18, 24]

追記

追記の例ですと、pandas の機能を使えばよいと思います。

python

1import pandas as pd 2 3data = pd.read_csv('data.csv') 4comp = pd.read_csv('hoge.csv') 5 6# data.csv の A 列が hoge.csv の Z 列と一致するもののみ抽出 7data[data['A'] == comp['Z']]
品物ABC
111222333
111222333
111222333
111222333

data.csv

csv

1品物,A,B,C 2あ,111,222,333 3い,111,222,333 4う,111,222,333 5え,111,222,333 6お,111,222,333 7か,111,222,333 8き,111,222,333 9く,111,222,333 10け,111,222,333 11こ,111,222,333 12さ,111,222,333 13し,111,222,333

hoge.csv

csv

1Z 2111 3222 4333 5111 6222 7333 8111 9222 10333 11111

投稿2018/11/16 07:27

編集2018/11/16 08:14
tiitoi

総合スコア21956

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

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

guest

0

リスト内の値と一つでも一致するなら抽出する

こういうことですか?

Python

1>>> lst = [3, 1, 4] 2>>> gen = filter(lambda e: e in lst, range(0, 10, 2)) # 第一引数はlst.__contains__ でも可 3>>> list(gen) 4[4]

質問編集を受けて

row[10]とcodelistが一致しているもののみ

『row[10]がcodelistに含まれるもののみ』という意味ではなく?
それならこんなふうに書けますが。

Python

1filter(lambda row: row[10] in codelist, rows)

さらに追記

要件が発散してきて良く分からないので、考え得る中で一番簡潔な方法を示します。

Python

1with open('ほげほげ.csv') as fin1, \ 2 open('ほげほげ書き込み.csv') as fin2: 3 4 next(fin1) 5 next(fin2) 6 7 for line1, line2 in zip(fin1, fin2): 8 item, tag1 = line1.split()[:2] 9 tag2 = line2.rstrip() 10 11 if tag1 == tag2: 12 print(item)

実行結果

あ え き こ

pandasを使うならばフィルタリングはpandasの機能に頼った方が良いかと。
読み取りでpandasを使ったりcsvモジュールを使ったり、使い分けている意味が良く分かりません。

投稿2018/11/16 07:16

編集2018/11/16 08:17
LouiS0616

総合スコア35660

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

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

essa

2018/11/16 07:31

質問を追記しました。ご確認いただけると幸いです。
LouiS0616

2018/11/16 07:52

kclはどこから湧いてきたのですか?
essa

2018/11/16 08:03

kclではなく、codelistですね。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問