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

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

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

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

Python 3.x

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

Q&A

解決済

3回答

530閲覧

指定した列のcsvファイルの中から、文字を検索し一致したときに、その行を持ってくる方法

green2021

総合スコア16

CSV

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

Python 3.x

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

0グッド

0クリップ

投稿2022/12/27 09:47

実現したいこと

指定した列のcsvファイルの中から、文字を検索し(テキストデータから読み取り)一致したときに、その行を持ってくる方法を知りたいです。
具体的には
csvファイル(member.csv)
no,month,blood
1,5,A
1,1,B
1,5,A
2,2,C
2,7,D
3,12,A
4,11,D

テキストデータ(file.txt)
1
4

出力結果のcsv(result.csv)
no,month,blood
1,5,A
1,1,B
1,5,A
4,11,D

といったCSVファイルがある場合に列名「no」について、値が「1」と「4」のものを出力する方法が知りたいです。

実際に、扱うデータはcsvファイルが200万行程度で、検索に扱うテキストデータは200行ほどです。
私が扱うデータが多いため、csv処理のライブラリはpandasではなく、daskという高速処理が可能なライブラリを使用しています。

また、pandasを用いた方法も教えていただけると幸いです。

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

出力結果のcsv(result.csv) no,month,blood 1,5,A 1,1,B 1,5,A 4,11,D ではなく、 no,month,blood 4,11,D となっています。

該当のソースコード

Python

1# coding: shift-jis 2 3import dask.dataframe as dd 4 5with open('file.txt', 'r') as f: 6 kw_list1 = f.read().split("\n") 7 8 9# ========================================================================================== 10# ヘッダーの型指定(処理の高速化に必要) 11dtype_dict={'no':'object', 12 'month':'object', 13 'blood':'object',} 14# ========================================================================================== 15 16 17# ========================================================================================== 18 19 20# マスタの読み込み 21member = dd.read_csv("member.csv", encoding='utf-8',engine='python', dtype=dtype_dict) 22 23for list in kw_list1: 24 member_list = member[member['no'] == str(list)] 25 26 27 print(member_list ) 28 29member_list .to_csv('result.csv',header=True,single_file = True,index=False) 30 31#member.csv 32no,month,blood 331,5,A 341,1,B 351,5,A 362,2,C 372,7,D 383,12,A 394,11,D 40 41 42#file.txt 431 444 45 46 47 48

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

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

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

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

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

TakaiY

2022/12/27 09:59

作業としては出力結果のCSVができればいいのでしょうか。 この問題が解決した後に、さらに処理をしたいなどということはありますか。
guest

回答3

0

また、pandasを用いた方法も教えていただけると幸いです。

python

1import pandas as pd 2 3with open('file.txt', 'r') as f: 4 kw_list1 = f.read().split("\n") 5 6member = pd.read_csv("member.csv", encoding='utf-8', dtype=str) 7member_list = member.query('no in @kw_list1') 8member_list.to_csv('result.csv', header=True, index=False)

result.csv

csv

1no,month,blood 21,5,A 31,1,B 41,5,A 54,11,D

投稿2022/12/27 12:45

melian

総合スコア19992

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

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

0

ベストアンサー

daskpandas はデータフレームの扱い方にほとんど違いはありません。

python

1import dask.dataframe as dd 2 3 4df = dd.read_csv("member.csv") 5 6with open('file.txt', 'r') as f: 7 keywords = f.read().split("\n") 8 9filter = df[df.no.isin(keywords)] 10result = filter.compute() 11result.to_csv("result.csv", header=True, index=False) 12
  • df.no という風にドット記法で、カラム名を呼び出しています。この no はカラム名の、"no" です。
  • isin() で指定した値が含まれているか判断します。boolean を返します。
  • compute() でデータフレームを算出します。ここが、pandas とは違う点です。
  • 算出されたデータフレームをファイルに書き込んで終了です。

投稿2022/12/27 12:18

Demerara

総合スコア397

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

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

0

とりあえず、簡単なやつを書きました。

python

1import csv 2 3with open('file.txt', mode='r') as f: 4 no_list = f.read().splitlines() 5 6with open('member.csv', mode='r', newline='') as m,\ 7 open('result.csv', mode='w') as r: 8 9 member_list = csv.reader(m) 10 11 result_list = csv.writer(r) 12 result_list.writerow(['no', 'month', 'blood']) 13 14 for member in member_list: 15 if member[0] in no_list: 16 result_list.writerow(member) 17

わざわざcsvリーダで読むこともなかったかもしれません。

投稿2022/12/27 10:22

TakaiY

総合スコア12959

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問