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

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

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

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

Python

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

Q&A

解決済

3回答

2787閲覧

python CSVの重複データ取得とその行番号を取得したい

aaa_bbb

総合スコア19

CSV

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

Python

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

0グッド

0クリップ

投稿2020/10/12 09:02

以下のようなCSVデータがあるとします。

【CSVデータ】 ID 氏名 生年月日 電話番号 00001,山田太郎,1980-01-01,09012345678 00002,佐藤花子,1982-11-11,09087654321 00001,山田太郎,1980-01-01,09012345678- 00003,田中桃子,1975-12-22,09012346666

【やりたいこと】
pythonでCSVデータの重複データ抽出及び、重複したCSVの行番号を取得したいです。

【想定する取得結果】
00001,山田太郎,1980-01-01,09012345678
2行目,4行目

【MEMO】
pandasを使用したらINDEXしかとれないので、他に方法があるのか質問させていただきました。
INDEXだからヘッダ分+1すればいいじゃないかという話もあるかもしれませんが。。

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

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

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

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

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

TakaiY

2020/10/12 09:14

「INDEXだからヘッダ分+1す」るのではだめな理由は何ですか?
toast-uz

2020/10/12 10:23

「pandasを使用したらINDEXしかとれない」のコードの提示と、その結果に何が不満なのかを記載ください。
aaa_bbb

2020/10/13 00:28

提供されるCSVがヘッダ有と無、両方でくる可能性がありまして、問題となったのは行番号の取得です。 実装方法を検討するうえで、事前にCSVヘッダ有無を調べて後からヘッダがあるならINDEXに足す方法と CSVの行番号そのままとる方法はないかと色々調べておりました。 >INDEXしかとれないは書き方に誤りがありました。  重複データもとれております。すみません。
toast-uz

2020/10/13 00:45

「提供されるCSVがヘッダ有と無、両方でくる可能性」 こういう、回答に影響を与える情報は、質問文に記載下さい。また、何をもってヘッダかどうかを判定するのか、コード以前に日本語として定義お願いします。
guest

回答3

0

ベストアンサー

python

1import pandas as pd 2import io 3 4data = """ 5ID,氏名,生年月日,電話番号 600001,山田太郎,1980-01-01,09012345678 700002,佐藤花子,1982-11-11,09087654321 800001,山田太郎,1980-01-01,09012345678 900003,田中桃子,1975-12-22,09012346666 10""" 11 12df = pd.read_csv(io.StringIO(data)) 13 14# 重複のみ抽出 15df1 = df[df.duplicated(keep=False)] 16 17# IDでグループ化、indexをリスト化 18df2 = df1.reset_index().groupby(by="ID")["index"].apply(list) 19df2.name = "重複" 20 21# 重複の最初のみ抽出 22df3 = df1.groupby(by="ID").first() 23 24# indexのリストを結合 25df4 = pd.merge(df3, df2, on="ID")
ID氏名生年月日電話番号重複
1山田太郎1980-01-019012345678[0, 2]

投稿2020/10/13 13:46

barobaro

総合スコア1286

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

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

aaa_bbb

2020/10/16 02:13

ご回答ありがとうございました!
guest

0

ヘッダかあったりなかったり、というのは考慮していませんが、重複の行を抽出をしつつ重複したindexのリストも情報として付加するコードを作ってみました。

Python

1import pandas as pd 2import io 3 4data = (''' 5ID,氏名,生年月日,電話番号 600001,山田太郎,1980-01-01,09012345678 700002,佐藤花子,1982-11-11,09087654321 800001,山田太郎,1980-01-01,09012345678 900003,田中桃子,1975-12-22,09012346666 10''') 11 12df = pd.read_csv(io.StringIO(data)) 13grouped = df.groupby(df.columns.tolist()) 14 15duplicated_groups = [] 16for _, group in grouped: 17 if len(group) <= 1: 18 continue 19 duplicated_groups.append(group.iloc[0].values.tolist() + [group.index.tolist()]) 20 21duplicated_df = pd.DataFrame(duplicated_groups, columns=(df.columns.tolist()+['重複'])) 22print(duplicated_df) 23# ID 氏名 生年月日 電話番号 重複 24#0 1 山田太郎 1980-01-01 9012345678 [0, 2]

投稿2020/10/13 12:09

toast-uz

総合スコア3266

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

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

aaa_bbb

2020/10/16 02:13

ご回答ありがとうございました!
guest

0

Python

1ID = df['ID'].copy() 2col = df.columns 3df = df.drop('ID', axis=1) 4d = df.duplicated(keep='last') 5df = df[d] 6df['ID'] = ID[d] 7df = df.reindex(columns=col) 8 9print(df) 10# ID 氏名 生年月日 電話番号 11# 0 00001 山田太郎 1980-01-01 9012345678

投稿2020/10/12 10:42

meg_

総合スコア10580

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

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

aaa_bbb

2020/10/16 02:13

ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問