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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

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

Q&A

解決済

2回答

3173閲覧

csvの重複判定について(python, for文)

usuke

総合スコア23

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

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

0グッド

0クリップ

投稿2020/06/25 08:21

csvの重複判定について

A列(カラム名:'kigou')に[A, A, B, C,...]といった文字列があるとき、
B列に、A列で重複している行に対して'重複'と出力させたいです。
つまりB列には[重複, 重複, null, null,...]という状態にしたいです。

以下のようにプログラムを組んだところ、B列が全て'重複'と出力されてしまいました。
どのようにしたらよいでしょうか。

python3.6

1 2data = pd.read_csv('kigou.csv',index_col=0,encoding='SHIFT-JIS') 3kigou = data['kigou'] 4 5for i in range(): 6 for j in range(): 7 if i != j and kigou[i] == kigou[j]: 8 data['判定'] = '重複' 9

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問のコードの最後の行にあるdata['判定'] = '重複'という文は、「判定」列の全ての値を'重複'にするという意味になります。「B列が全て'重複'と出力されてしま」うのはこのためです。


pandasでは、for文を使用しなくても手軽に操作できるように多くの便利なメソッドが実装されています。
pd.Series.duplicated()を使うと、列内で重複している値にTrue、ユニークな値にFalse、が入った列が返ってきます。
pandas.Series.duplicated — pandas documentation
pandas.DataFrame, Seriesの重複した行を抽出・削除 | note.nkmk.me

これをインデックスにして'重複'を挿入すれば希望の列が作成できます。

python

1In [11]: df = pd.DataFrame({'kigou': list('AABC')}) 2 3In [12]: df.loc[df['kigou'].duplicated(False), 'B'] = '重複' 4 5In [13]: df 6Out[13]: 7 kigou B 80 A 重複 91 A 重複 102 B NaN 113 C NaN

速度テスト

python

1import pandas as pd 2import perfplot 3 4 5def duplicated(df): 6 is_duplicated = df['kigou'].duplicated(keep=False) 7 df.loc[is_duplicated, 'B'] = '重複' 8 return df 9 10 11# tiitoi氏の解答 12def groupby_tf(df): 13 is_unique = df.groupby('kigou')['kigou'].transform('count') > 1 14 df.loc[is_unique, 'B'] = '重複' 15 return df 16 17 18df = pd.DataFrame({'kigou': list('AAABBCDEFF')}) 19ppdata = perfplot.bench( 20 setup=lambda n: pd.concat([df]*(n-1), ignore_index=True, axis=0), 21 n_range=[2 ** k for k in range(1, 22)], 22 kernels=[duplicated, groupby_tf], 23 labels=["duplicated", 'groupby_tf'], 24 xlabel="len") 25ppdata.show(time_unit="s")

ppshow

投稿2020/06/26 02:17

編集2020/06/26 04:07
kirara0048

総合スコア1399

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

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

0

手順

以下の手順でできます。

    1. df.groupby("A")["A"].transform("count") でA列の各値の個数を取得する。

txt

10 2 21 2 32 1 43 1 5Name: A, dtype: int64
    1. df.groupby("A")["A"].transform("count") > 1 で重複している行を特定
    1. loc[] でその行に"重複"という文字を代入

コード

python

1import pandas as pd 2 3df = pd.DataFrame({"A": ["A", "A", "B", "C"]}) 4is_unique = df.groupby("A")["A"].transform("count") > 1 5df.loc[is_unique, "B"] = "重複" 6print(df) 7# A B 8# 0 A 重複 9# 1 A 重複 10# 2 B NaN 11# 3 C NaN

投稿2020/06/25 08:50

編集2020/06/25 08:51
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問