この前仕事で匿名化を頼まれかなり苦労した。
そもそもデータをもらう時点で匿名化されていることがほとんどで匿名化されていないデータをもらうことがほとんどなかった。
実際調べてみるとハッシュ化する方法はあるが、データフレーム形式を想定している情報は少なかった。
機密データなのでオフライン環境でやらないといけないかもしれないため、ライブラリは事前にインストールされている想定である。
今回は次回のために反省点も踏まえてコードをまとめていきたい。
Rでのやり方
ハッシュ化のライブラリはfastdigestを使う。
指定するのはインポートするcsvとハッシュ化したい列名だけ。
対話形式で一つ一つ確認して作業することができる。
hashing.R
# ライブラリインストール
install.packages("fastdigest")
# ライブラリインポート
library("fastdigest")
# fastdigestを使ってハッシュ化の自作関数を作る
hash_algo <- function(data){
x <- paste("abc" ,data)
x <- fastdigest(x)
return(x)
}
#データの読込み
path <- ""
df <- read.csv(path, header=T)
# 読み込みの確認
str(df)
# ハッシュ化したい列名の格納
hash_list <- c("", "",...)
# ハッシュ化
for (i in 1:length(hash_list)){
df[,hash_list[i]] <- sapply(df[,hash_list[i]], fastdigest)
}
# エクスポート
write.csv(df,"hashed.csv")
Pythonでのやり方
pandasとhashlibを使ってハッシュ化を行う。
Pythonはスクリプトでサクッと終わらせたい。
事前にハッシュ化したい列名を決めておいき、パスを指定してコードを実行するだけ。
hashing.py
import os
import sys
import pandas as pd
import hashlib
# ハッシュ化したい列名の格納
hash_list = []
# ハッシュ化ルールの関数
def hash_algo(data):
# ここを複雑に書くと逆変換されにくくなる
x = "abc" + str(data)
x = hashlib.sha256(x.encode("utf-8")).hexdigest()
return x
# 読み込みから出力
def hashing(path, hash_list=hash_list):
# データの読み込み
df = pd.read_csv(path, encoding='utf-8')
# ハッシュ化処理
for i in range(0,len(hash_list)):
df[hash_list[i]] = list(map(hash_algo, df[hash_list[i]]))
# ファイルのエクスポート
outpath = os.path.dirname(path)
outfilename = os.path.splitext(os.path.basename(path))[0] + "_hashed.csv"
df.to_csv( outpath + "/" + outfilename, index=False)
if __name__ == "__main__" :
hashing(sys.argv[1])
もしもっと賢いやり方あったら教えてください。