読者です 読者をやめる 読者になる 読者になる

東京に棲む日々

データ分析、統計、ITを勉強中。未だ世に出ず。

Python - pandas練習3 (氏名のマスキング)

個人名(日本語)の簡単なマスキング操作。実行はipython。

 

import pandas as pd
from pandas import Series, DataFrame
import string

 

# 外部ファイルからの読み込み結果と同じとなるよう、日本語はunicodeと指定する。
d1 = DataFrame({
'id': [1, 2, 3, 4],
'name_en': ['yasuo ohashi', 'chikuma hamada', 'tomoyuki higuchi', 'yasushi nagata'],
'name_kn': [u'オオハシヤスオ', u'ハマダ チクマ', u'ヒグチトモユキ', u'ナガタヤスシ'],
'name_kj': [u'大橋靖男', u'浜田 筑摩', u'樋口智之', u'永田康']
}, columns = ['id', 'name_en', 'name_kn', 'name_kj'])

d1

   id           name_en   name_kn name_kj
0   1      yasuo ohashi   オオハシヤスオ    大橋靖男
1   2    chikuma hamada  ハマダ チクマ   浜田 筑摩
2   3  tomoyuki higuchi  ヒグチトモユキ    樋口智之
3   4    yasushi nagata   ナガタヤスシ     永田康

 

type(d1.ix[0, 'name_en'])         # str
type(d1.ix[0, 'name_kn'])         # unicode
type(d1.ix[0, 'name_kj'])          # unicode

 

##### エンコード、デコードの復習 #####

 

print d1.ix[0, 'name_kn']      # オオハシヤスオ
d1.ix[0, 'name_kn']              # u'\uff75\uff75\uff8a\uff7c\uff94\uff7d\uff75'

str1 = d1.ix[0, 'name_kn'].encode('utf8')        # unicodeからstrへ変換(エンコード - 符号化)
str1            # '\xef\xbd\xb5\xef\xbd\xb5\xef\xbe\x8a\xef\xbd\xbc\xef\xbe\x94\xef\xbd\xbd\xef\xbd\xb5'
# 文字リテラル(\x??)により、?部分が16進数の、16進数文字×2の組み合わせ文字として出力される

 
str1[0]             # '\xef'    これで一つの文字と認識される
len(str1)          # 21
type(str1)        # str

 

# strからunicodeへ変換(デコード - 本来の型へ)
uni1 = str1.decode('utf8')       
uni1                  # u'\uff75\uff75\uff8a\uff7c\uff94\uff7d\uff75'

type(uni1)         # unicode

print uni1          # オオハシヤスオ

 

##### マスキングを実行する関数を定義、DataFrameの列(Series)に適用し、新たなデータとして保存 #####

 

# str列が'0123456789...'とあれば、'0132465798...'と順序を入れ替えて返す関数

def coding(strg):	# strを引数に取り、順序を入れ替えたstrを返す
	l = list(strg)	# str -> list
	for i in range( len(strg)/3 - 1 ):	# 長さ/3 - 1
		head = 2 + 3*i
		tail = 3 + 3*i
		temp = l[head]
		l[head] = l[tail]
		l[tail] = temp
	return ''.join(l)	# list -> str

 str1_code = coding(str1)
str1_code         # '\xef\xbd\xef\xb5\xbd\xef\xb5\xbe\xef\x8a\xbd\xef\xbc\xbe\xef\x94\xbd\xef\xbd\xbd\xb5'

 

# 前 '\xef\xbd\xef\xb5\xbd\xef\xb5\xbe\xef\x8a\xbd\xef\xbc\xbe\xef\x94\xbd\xef\xbd\xbd\xb5'
# 後 '\xef\xbd\xb5\xef\xbd\xb5\xef\xbe\x8a\xef\xbd\xbc\xef\xbe\x94\xef\xbd\xbd\xef\xbd\xb5'

# 前後で位置により文字が入れ替わっている

 
str1_code.decode('utf8') 

# unicodeにデコードしようとしても、UnicodeDecodeErrorが出力され、デコードできない

 

# unicodeをstrに変換してからcoding関数を適用する関数

def fn_coding(uni):
	return coding(uni.encode('utf8'))

# unicodeであるDataFrameの列(Series)に適用するために必要

 

# d1['name_kn'] 列に適用
name_kn_code = Series( map(fn_coding, d1['name_kn']) )

name_kn_code

0     ????^?ス?
1    ???? ???マ
2    ?????????
3     ??????ス?
dtype: object

 

# name_kjにも適用
name_kj_code = Series( map(fn_coding, d1['name_kj']) )

 

# DataFrameにまとめ、保存してみる
d1_code = d1.copy()

d1_code['name_kn'] = name_kn_code
d1_code['name_kj'] = name_kj_code

# 書き出し
d1_code.to_csv(r'C:\パス\d1_code.csv', index=False)

 

 

保存したデータをExcels-jis)で開くとこんな感じ。

f:id:High_School_Student:20140721132457j:plain

 このデータを読み込み、マスキングを元に戻してみる。

 

 

##### データを読み込み、マスキングを元に戻す関数の実行 #####

 

# 読み込みd2に格納
d2 = pd.read_csv(r'C:\パス\d1_code.csv')
d2

   id           name_en    name_kn name_kj
0   1      yasuo ohashi   ????^?ス?   ???疔?
1   2    chikuma hamada  ???? ???マ  ?? ??摩
2   3  tomoyuki higuchi  ?????????   ?????
3   4    yasushi nagata   ??????ス?    ??尺?

 

# マスキングを元に戻す方法だが、順番を入れ替えているだけなので単に上で定義したcoding 関数を適用すれば良い

name_kn_ognl = Series( map(coding, d2['name_kn']) )

0     オオハシヤスオ
1    ハマダ チクマ
2    ヒグチトモユキ
3     ナガタヤスシ

 name_kj_ognl = Series( map(coding, d2['name_kj']) )

0     大橋靖男
1    浜田 筑摩
2     樋口智之
3      永田康

 

以上