質問するログイン新規登録
CSV

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

Python 3.x

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

Q&A

解決済

2回答

547閲覧

CSVデータの条件に合うデータ削除の編集方法について

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

Python 3.x

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

0グッド

0クリップ

投稿2022/09/08 05:25

0

0

前提

CSVデータをpythonでデータ解析するため、前処理として構造化データにしたい。

実現したいこと

カラムが無い列などがあり、その列を削除したい。
しかし、処理したい列数などは毎回異なるため、条件に合うセル?を削除する方がコード的には楽。
今回、"----"となっているデータを "" の状態ではなく、   の完全に空白の状態に編集したい。

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

エラーメッセージなし

該当のソースコード

fn = 'Target.csv'

with open(fn, "r") as f:
s = f.read()
s = s.replace("----","")

with open(fn, "w") as f:
f.write(s)

試したこと

python

1fn = 'Target.csv' 2 3with open(fn, "r") as f: 4 s = f.read() 5s = s.replace("----","") 6 7with open(fn, "w") as f: 8 f.write(s)

補足情報(CSVデータの中身は以下の通りです。)改行部分は■

"データ単位","分単位"■
"開始日時","2022/09/07 16:00"■
"終了日時","2022/09/07 18:00"■
"Signal Name","LatestDataDate(YEAR)","LatestDataDate(MONTH)","LatestDataDate(DAY)","LatestDataDate(HOUR)","LatestDataDate(MIN)","LatestDataDate(SEC)","pH","指数1","指数2","指数3","指数4","指数5"■
"2022/09/07 16:00","2022","9","7","7","0","0","6.80","207","229","42.40","8912","-118","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----"■
"2022/09/07 16:01","2022","9","7","7","1","0","6.80","208","228","42.40","8975","-112","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----"■
"2022/09/07 16:02","2022","9","7","7","2","0","6.81","206","229","42.40","8937","-117","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----"■

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

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

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

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

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

TakaiY

2022/09/08 05:52

この件、だいぶ前から質問になっているようですが、今回もXY問題のように思います。本当に「----」を削除するのが目的ですか? CSVデータDataFrameにする前に適切に処理することにしたのはいいと思うのですが、 ** このデータにどのような問題があって、どのようにしたいのか?** を書いた方がいいと思います。 たしか、このデータ、4行目の 列名と以降のデータの数が合っていないんですよね?で、それをどのように併せたいのですか? 他にも何か問題はありますか?
can110

2022/09/08 05:52

「空白の状態」とは具体的にはどのような結果としたいでしょうか。 たとえば「~,"-112","----","----",~」なら 「~,"-112",,,~」のように「,」(列)を残したまま 「~,"-112"」のように「,」(列)自体を削除したい のいずれかでしょうか。
退会済みユーザー

退会済みユーザー

2022/09/08 06:05

Takai Y さん 前のコメントまでご覧頂き、本当にありがとうございます。 私の説明不足で申し訳ありません。 4行目以降のカラム名のないデータを削除したいです。 過去からの問題点がやっと明確になってきました。 これができれば、概ね改善できる見込みでおります。
退会済みユーザー

退会済みユーザー

2022/09/08 06:06

can110さん コメントありがとうございます。 後者のやり方、列そのものを削除したいです。 該当条件は"----"がある行と言う感じです。
TakaiY

2022/09/09 11:29 編集

「4行目以降のカラム名のないデータを削除」と、「該当条件は"----"がある行」は違う可能性があります。 また、別の回答への回答に 「"----"には、追加のデータが入る場合もあるのです。 渡されるデータ形式はこの状態なのですが、対象によっては"----"の部分に追加データが入ります。 その場合は、カラム名が入ることから、カラム名のない"----"のみを削除したいのです。」 とあります。 ようするにやりたいことは、「4行目=カラム名のある行 の列の数だけ以降の行のカラムを残す」ということではありませんか? そもそも、カラム名の内データは不要であり、また、たとえばカラム名があっても"----"であるようなデータには意味があるはずです。 いかがですか?
退会済みユーザー

退会済みユーザー

2022/09/11 23:44

何度もご返信くださり、本当にありがとうございます。 私の御説明が不足しており、申し訳ありません。 このCSVファイルは、様々な状態で保存・更新されているデータベースからダウンロードしてくるものです。 ダウンロードしたものにより、行が5行、8行、7行のものとばらばらに存在します。 しかし、データの保存行数には枠があるようで、何もデータが無い行には、カラム名が入らず、 "----"と表示されます。 ここで、問題となっているのが、pandasでは、行列がカラム含めて数が合っていないと構造データと 認識してくれないことです。 なので、ダウンロードしたデータをそのまま使用すると、カラムのあるデータまでが行のカラム名と認識され、不要な"----"のデータ部分をデータとして認識してしまいます。 このことから、カラム名の無い"----”の部分を削除した上で読み込みたいと考えております。 しかし、置換え処理を行った場合、"----"→ に置き換えたいのですが、"----"→""でしか置換えが できず、ひじょいに頭を悩ませております。 ダウンロードするファイルごとに行数も異なるため、置換えが最も楽な方法と考えたのですが。。。。 伝わりましたでしょうか。。。 レベルの低い内容とご相談で恐縮です。
TakaiY

2022/09/13 06:31

行の事を言っているのか列のことを言っているのかよくわからないんですが、 以下の確認がしたいです 1) 4行目に列名の一覧がある。(yes/no) 2) 5行目以降がデータの行である(yes/no) 3) 5行目以降の列で、4行目の列の数より多い部分は不要である。(yes/no) 4行目: "a","b","c","d" 5行目: "6.80","207","229","42.40","----","----","----" 6行目: "42.40","8975","-112","----","6.81","206","229" このとき、5行目の「"----","----","----"」と6行目の「"6.81","206","229"」は不要なデータだと思いますが、合ってますか? それとも、6行目の "ーーーー"を削除して、左に詰めて、6.81を有効なデータとしますか? (そのような扱いは考えられないですが)
退会済みユーザー

退会済みユーザー

2022/09/14 00:32

なんどもコメントをくださり、ありがとうございました。 なんとか自己解決できました。 心よりお礼申し上げます。
guest

回答2

0

ベストアンサー

以下のように、 ' と " を使い分けて、セルごと除去することで、不要部分である"----"のセルを削除することができた。
これにより、行列数のあった構造化データとなり、問題なくpandasで表として読みこむことができた。

python

1fn = 'Target.csv' 2 3with open(fn, "r") as f: 4 s = f.read() 5 s = s.replace('"----"','') 6 s = s.replace(',"0"','') 7with open(fn, "w") as f: 8 f.write(s)

投稿2022/09/14 00:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

  • 行毎に読み込んで,でリストに分割
  • リストから"----"以外を抽出
  • リストを,で連結して文字列に戻す
  • 戻した文字列を書き込む

といった感じで処理すれば目的は実現できると思います。
が、そもそもの元データのうち欲しい部分だけ読み込む方が簡単だと思います。

Python

1import pandas as pd 2from io import StringIO 3 4# テストデータ 5s = """"データ単位","分単位" 6"開始日時","2022/09/07 16:00" 7"終了日時","2022/09/07 18:00" 8"Signal Name","LatestDataDate(YEAR)","LatestDataDate(MONTH)","LatestDataDate(DAY)","LatestDataDate(HOUR)","LatestDataDate(MIN)","LatestDataDate(SEC)","pH","指数1","指数2","指数3","指数4","指数5" 9"2022/09/07 16:00","2022","9","7","7","0","0","6.80","207","229","42.40","8912","-118","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----" 10"2022/09/07 16:01","2022","9","7","7","1","0","6.80","208","228","42.40","8975","-112","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----" 11"2022/09/07 16:02","2022","9","7","7","2","0","6.81","206","229","42.40","8937","-117","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----","----" 12""" 13 14df = pd.read_csv(StringIO(s),skiprows=3,usecols=range(13)) # 13=欲しい列数 15print(df)

投稿2022/09/08 06:20

can110

総合スコア38352

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

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

退会済みユーザー

退会済みユーザー

2022/09/08 06:23

ありがとうございます。 なお、欲しい行列数が、都度異なる場合はどうすればよいでしょうか。 "----"には、追加のデータが入る場合もあるのです。 渡されるデータ形式はこの状態なのですが、対象によっては"----"の部分に追加データが入ります。 その場合は、カラム名が入ることから、カラム名のない"----"のみを削除したいのです。
退会済みユーザー

退会済みユーザー

2022/09/08 06:24

あ、上のコメントに記載の内容で実施すればよいということですね。 失礼しました。 ちょっとコードがすぐ浮かびませんが、やってみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問