LoginSignup
17
20

More than 3 years have passed since last update.

csv のデータが重複してるよ〜 -> それ、pandas で除けまっせ

Last updated at Posted at 2017-10-02

こんなこと起きた

csv を DB に入れようと思ったけど、primary key がダブリまくってる!
重複してる行を削除したいけど、excel で開けないほど重い・・・。
python でデータ処理しようかな・・・でも、たまには違う方法でやりたい・・・。

せや、pandas 使ったろ

環境整備

はしょります(^o^)
Macにanacondaをインストールする→ライブラリの追加 などを見てください。
anaconda を入れた後で jupyter を起動すると、
pandas を使うときに、途中経過などが見やすくて便利です。

こうするんじゃ!

まずは pandas を import して、csv を読み込む!

import pandas as pd
hoge = pd.read_csv('hoge.csv')

date にしたければ、parse_dates を使ってみたり、
column に名前つけたければ names 使ってみたり、
型指定したければ dtype を使ってみたりしてください。

hoge = pd.read_csv("hoge.csv",
                   parse_dates=[1],  # 対象のカラムインデックス
                   names=['hoge', 'fuga', 'hage'],
                   dtype={2: str}  # カラムインデックスと型の dict
                   )

次に重複を削除するために、先にソートします。
ソートしておくと、先にヒットするものを残すという処理が使えるようになるので、
残したい行が上に来るようにソートします。

sorted_hoge = hoge.sort_values(['hoge', 'fuga'],  # カラム名
                               ascending=[1, 0])  # desc か asc か

そして削除!

no_duplicated_hoge = sorted_hoge.drop_duplicates('hoge',  # このカラムで重複していると、
                                                 keep='first')  # 最初を残すようにする

最後に csv に書き込みましょう。

no_duplicated_hoge.to_csv('result.csv', 
                          index=False,  # 0, 1, 2... みたいなデータは要らないので削除 
                          date_format='%Y%m%d')  # 日付データがある場合は、これで変換可

結果

全然大したことしてないんですけど、
ささっと jupyter 起動して、ちゃかちゃか pandas 使うと、
「なんか俺凄いじゃん?」って気分になれるのでおすすめです。

おまけ(jupyter で使った、その他メソッド)

jupyter で途中経過を表示するために、head() というメソッド使うと良いと思います。
重複具合を調べたければ value_counts()
データの加工は、例えば行追加は loc()、中の文字列を置換したければ replace() とかあって、とても便利です。

「python で import csv して、with open()reader = csv.reader(f)for line in reader して...」に飽きたら、
jupyter + pandas に挑戦すると良いと思います!

17
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
20