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

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

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

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

Q&A

解決済

2回答

988閲覧

重複したデータを見つけて1つ以外削除

ken248

総合スコア24

Python

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

0グッド

0クリップ

投稿2022/01/24 05:41

イメージ説明

こちらのデータの前処理で困っています。
B,C,E列が同じ値の時、D列の最大値以外のデータを削除したいです。
つまり、上のデータで言うならば、3行目を削除したいです。

このデータ処理の前過程的(以下のプログラム)にpandasは使わずに行いたいです。
リストを辞書化するなど色々試したつもりですが、自力ではできなかったです。

どうかご教授お願い致します。

以下のプログラムは前過程の部分です。

python

1 2import csv 3import collections 4 5save_name = r"C:\Users\python/2022-01-13.csv" 6 7def write_macrosheet(): 8 9 f = open(save_name, "r") 10 reader = csv.reader(f) 11 data = [ e for e in reader ] 12 13#20211101 データの年月日と設備Noが0の時は削除!(本データでは4行目は削除されるはず) 14 data_len = len(data) 15 # print(data_len) 16 for d in reversed(range(data_len)): 17 if data[d][0][0:2]== "00" and data[d][5][0:1]== "0": 18 del data[d] 19 20#20211213 uniqueデータのみにする 21 seen = [] 22 unique_list = [x for x in data if x not in seen and not seen.append(x)] 23 data = unique_list 24 25#発生時間[B]と番号[C]と番号[E]が同じものは時間[D]が最大のものだけ残して他削除 26

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

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

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

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

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

TakaiY

2022/01/24 06:19

> B,C,E列が同じ値の時、D列の最大値以外のデータを削除したいです。 つまり、上のデータで言うならば、3行目を削除したいです。 とありますが、どうして3行目が削除されるのかわかりません。
ken248

2022/01/24 08:12

ありがとうございます。 5行目が15.5に対して3行目は15.3なので削除したいです。 私が見逃しているようなデータにミスがあったら申し訳ございません。
guest

回答2

0

このデータ処理の前過程的(以下のプログラム)にpandasは使わずに行いたいです。

参考として Pandas を使う場合。

python

1import pandas as pd 2import io 3 4csv_data = ''' 5A,B,C,D,E,F,G,H 62022/1/12,11:06:07,350,2.2,1,1,28,0 72022/1/12,11:05:51,220,2.4,1,2,28,0 82022/1/12,10:04:26,446,15.3,1,3,28,0 900/00/00,0:00:00,0,0,0,0,0,0 102022/1/12,10:04:26,446,15.5,1,3,28,0 11''' 12df = pd.read_csv(io.StringIO(csv_data)) 13 14dfx = ( 15 df.groupby(['B', 'C', 'E'], sort=False, as_index=False) 16 .apply(lambda x: x.sort_values('D').tail(1)) 17 .reset_index(drop=True)) 18 19print(df) 20# A B C D E F G H 21#0 2022/1/12 11:06:07 350 2.2 1 1 28 0 22#1 2022/1/12 11:05:51 220 2.4 1 2 28 0 23#2 2022/1/12 10:04:26 446 15.3 1 3 28 0 24#3 00/00/00 0:00:00 0 0.0 0 0 0 0 25#4 2022/1/12 10:04:26 446 15.5 1 3 28 0 26 27print(dfx) 28# A B C D E F G H 29#0 2022/1/12 11:06:07 350 2.2 1 1 28 0 30#1 2022/1/12 11:05:51 220 2.4 1 2 28 0 31#2 2022/1/12 10:04:26 446 15.5 1 3 28 0 32#3 00/00/00 0:00:00 0 0.0 0 0 0 0

投稿2022/01/24 07:40

編集2022/01/24 07:42
melian

総合スコア19805

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

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

ken248

2022/01/24 08:11

ありがとうございます。 pandasだと関数が多くて使いやすいですよね! ありがとうございました。
guest

0

ベストアンサー

いろいろな方法があると思うけど、そのひとつの方法

py

1import csv 2 3def read_csv(filename): 4 with open(filename, "r") as f: 5 return list(csv.reader(f)) 6 7def unique(data): 8 #発生時間[B]と番号[C]と番号[E]が同じものは時間[D]が最大のものだけ残して他削除 9 unique = [] 10 index = {} # (B, C, E) をキー、 uniqueのインデックス番号を値にした辞書 11 for row in data: 12 a, b, c, d, e, f = row 13 if a.startswith("00") and f == "0": 14 continue 15 key = (b, c, e) 16 if key in index: 17 if float(d) > float(unique[index[key]][3]): # D列値が大きければ置換 18 unique[index[key]] = row 19 else: 20 index[key] = len(unique) 21 unique.append(row) 22 return unique 23 24 25print(unique(read_csv(r"C:\Users\python/2022-01-13.csv")))

投稿2022/01/24 06:42

shiracamus

総合スコア5406

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

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

ken248

2022/01/24 08:10

ありがとうございます! 無事実行できました! keyを使うのは初めてだったので勉強になりました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問