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

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

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

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

Python

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

Q&A

解決済

1回答

7711閲覧

python csv 特定文字列のある行を削除

daisanrock

総合スコア8

CSV

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

Python

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

0グッド

2クリップ

投稿2019/10/01 04:09

pythonでcsvを動かすコードを書いております。
処理内容としましては以下となります。

  1. フォルダ内にあるcsvを結合
  2. 「果物」列で重複しているものを1つ残し、それ以外の行を削除。
  3. csvへ出力
  4. csv読み込み
  5. 3列目に「トマト」の文字列があれば行を削除
  6. 3列目に「きゅうり」の文字列があれば行を削除
  7. csvへ出力

上記「5.」「6.」のところが考え通りに動きません。
どのような記述がよろしいのかご教示願います。
ちなみに「5.」のみの記述とした場合、「トマト」の文字列ありの行は削除できます。

import json,csv import pandas as pd import glob import csv csv_files = glob.glob('*.csv') list = [] for f in csv_files: list.append(pd.read_csv(f)) df = pd.concat(list) df.duplicated("果物") dropdf=df.drop_duplicates("果物") dropdf.to_csv("csv matome choufuku.csv",index=False) data_rows=[] with open('csv matome choufuku.csv','r') as f: #csv読み込み reader=csv.reader(f) header=next(reader) for row in reader: if 'トマト' not in row[2]: #上記「5.」の処理 data_rows.append(row) elif 'きゅうり' not in row[2]: #上記「6.」の処理 data_rows.append(row) with open('csv kansei.csv','w',newline='') as f: writer=csv.writer(f) writer.writerows(data_rows)

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

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

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

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

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

guest

回答1

0

ベストアンサー

条件文を

Python

1if 'トマト' not in row[2]: #上記「5.」の処理 2 data_rows.append(row) 3elif 'きゅうり' not in row[2]: #上記「6.」の処理 4 data_rows.append(row)

のように記述すると

  • 3列目が**'きゅうり'**の場合

最初の条件文は『 'トマト'以外』なので条件に合致し、2行目で data_rowsに行を追加される

  • 3列目が**'トマト'**の場合

最初の条件文では条件に合致しないが、3行目の2つ目の条件が『'きゅうり'以外』なので条件に合致し、4行目で data_rowsに行を追加される

という動作になりますので、仕様を満たしません。

仕様を満たしたいのであれば、

Python

1if row[2] not in ['トマト', 'きゅうり'] : #上記「5.」「6.」の処理 2 data_rows.append(row)

のように記述するとよいのではないでしょうか。


とここまで書きましたが、コードの前半のCSVのマージ部では **pandas **を使っているにもかかわらず、後半部はわざわざループで処理しているのは不思議でしょうがありません。
後半部も pandas をつかって

Python

1import pandas as pd 2import glob 3 4csv_files = glob.glob('*.csv') 5list = [] 6 7for f in csv_files: 8 list.append(pd.read_csv(f)) 9 10df = pd.concat(list) 11 12df.duplicated("果物") 13dropdf=df.drop_duplicates("果物") 14 15dropdf.to_csv("csv matome choufuku.csv",index=False) 16 17# 3列目が'トマト'か'きゅうり'の列を削除 18kansei_df = dropdf[~dropdf.iloc[:, 2].isin(['トマト' ,'きゅうり'])] 19# CSV化 20kansei_df.to_csv('kansei.csv')

では駄目なのでしょうか?


仕様を間違って理解しておりましたので、修正します。

【修正コード】

for文の場合の条件文

Python

1if ('トマト' not in row[2]) and ('きゅうり' not in row[2]): 2 data_rows.append(row)

pandasの場合

Python

1kansei_df = dropdf[~dropdf.iloc[:, 2].str.contains('トマト|きゅうり')]

となるかと思います。


【更に追記】
'いちご'をふくむ文字列以外を削除

for文の場合の条件文

Python

1if 'いちご' in row[2]: 2 data_rows.append(row)

pandasの場合

Python

1kansei_df = dropdf[dropdf.iloc[:, 2].str.contains('いちご')]

投稿2019/10/01 05:21

編集2019/10/01 07:00
magichan

総合スコア15898

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

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

daisanrock

2019/10/01 06:31 編集

ご対応ありがとうございます! 申し訳ありません。個別にできたコードを無理やり?合体しているので不思議なコードになっているかもしれません。初心者なので認識できていません…。 'トマト'または'きゅうり'の文字列を含む行の削除は出来ませんでした。
magichan

2019/10/01 06:47

セルの文字が 'トマト' または 'きゅうり'なのではなく、'トマト'または'きゅうり'を『含む』文字列なのですね・・。勘違いしてましたので修正します。
daisanrock

2019/10/01 06:48

逆に例えば 'いちご' を含む文字列以外の行を削除のパターンもご教示いただけないでしょうか?
magichan

2019/10/01 07:01

回答を追記しました。 たぶん動作すると思いますが、(大変申し訳ありませんが)動作確認を行っておりませんので、動かなかったら文句を言ってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問