一言日記:神エクセルと戦う日々が続く今日このごろ。
#主題
No. | 名前 | 年齢 |
---|---|---|
1 | 田中 太郎 | 33 |
2 | 鈴木 次郎 | 22 |
3 | 田中 三郎 | 11 |
上表をデータとして扱う時は特に何も困ることはないのだが、
アウトプットする時にはちょこちょこ「下表のようにしてくれ」、という要望がある。
No. | 名前 | 年齢 |
---|---|---|
1 | 田中(太) | 33 |
2 | 鈴木 | 22 |
3 | 田中(三) | 11 |
意外とこの処理そのものをしているページが見当たらなかったので、実装結果を載せておく。
#実装
PRG
dataframe_raw = pd.read_excel("名簿.xlsx")
df=dataframe_raw["名前"].str.split(' ',expand=True)
#このケースでは全角スペースで氏名が分割されていたので、splitで2列にする
splitで割るとdataframe_processは下表のようになるので、ここから名字の重複を調べ、
重複があれば特殊処理、なければ名字をそのまま使う。
0 | 1 |
---|---|
田中 | 太郎 |
鈴木 | 次郎 |
田中 | 三郎 |
df["名前"]=""
#3列目に格納用の列を足す
for i in range(0,len(df)):
#iを0~名簿の長さまでループさせる
NAME = df.at[i,0]
check_count=(df[0]==NAME).sum()
#i行目0列に格納された文字列が、0列目に何個あるかを数える(2以上なら同じ名字の人間がいることになる)
if check_count>=2:
df.at[i,"名前"]=df.at[i,0]+"("+df.at[i,1][0]+")"
#重複がある場合、「i行目の名前列」には、0列目の文字列+(「1列目の文字列の0文字目」)を代入する
else :
df.at[i,"名前"]=df.at[i,0]
#重複が無い場合、「i行目の名前列」には、i行目0列目の文字列+(i行目1列目の文字列の0文字目)を代入する
この処理で、データフレームは下表のようになるので、後は名前列を代入するなり結合するなりして使えばOK
0 | 1 | 名前 |
---|---|---|
田中 | 太郎 | 田中(太) |
鈴木 | 次郎 | 鈴木 |
田中 | 三郎 | 田中(三) |
#終わりに
比較的キレイに纏まった気がするが、同姓同名の名簿が出てきたらどうしようかと戦々恐々である。