0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

備忘録(名簿の中の同姓の人にだけ名前を追記する)

Posted at

一言日記:神エクセルと戦う日々が続く今日このごろ。
#主題

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 名前
田中 太郎 田中(太)
鈴木 次郎 鈴木
田中 三郎 田中(三)

#終わりに
比較的キレイに纏まった気がするが、同姓同名の名簿が出てきたらどうしようかと戦々恐々である。

0
3
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?