#データ説明
1列目にメールアドレス(email
)、2列目にその送り主と思わしき複数の候補名(names
)が入っているデータフレームdf_email_with_names
があります。
1列目 email
は、名前の一部を含み、同じgmailドメインではあるものの、アドレス自体には統一の規則はありません。
2列目 names
はセミコロン(;)で各名前が区切られており、名前の前に不要なスペースが入っているケースもあります。また、名前の数もバラバラです。
index | names | |
---|---|---|
0 | takashi@gmail.com | Tanaka Takeshi; Horiguchi Minoru; Yamada Hanako |
1 | hima@gmail.com | Uchida Kiwamu; Hisaishi Makoto |
2 | yasuko-oyama@gmail.com | Oyama Yasuko |
... | ... | ... |
100 | ksaki@gmail.com | Inoue Yuta; Yamasaki Toru; Kawaguchi Saki |
#得たい結果
df_email_with_names
の各行ごとに、names
の名前の一部がemail
に含まれている送り主を抽出し、新たな列 corresponding_name
に格納したいです。
#現状以下のようにコーディングしてみました(環境: google colaboratory)
python
1import pandas as pd 2import numpy as np 3 4 5# names列の不要なセミコロン除去 6df_email_with_names['names'] = df_email_with_names['names'].str.split(";") 7#df_email_with_names['names'] = df_email_with_names['names'].str.replace(" ", "") ←うまく行かないので次のブロックで対応 8 9 10 11# names列の不要なスペース除去 12l_cleaned = [] 13 14for i in range(len(df_email_with_names['names'])): 15 temp = df_email_with_names["names"][i] 16 temp2 = [s.lstrip(" ").lower() for s in temp] 17 l_cleaned.append(temp2) 18 19# names列をきれいにしたものを元のデータフレームとマージ 20s_cleaned = pd.Series(l_cleaned) 21df_cleaned = pd.DataFrame({'cleaned_names': s_cleaned}) 22df_cleaned['index'] = df_cleaned.reset_index().index 23df_merge_original_data = pd.merge(df_email_with_names, df_cleaned, on='index', how='outer') 24df_merge_original_data 25 26 27 28 29#cleaned_names列の一部が、emailに含まれるかどうかを判定 30df_out = pd.DataFrame(index=range(0,len(df_merge_original_data)),columns=['index']) 31df_out['index'] = df_out.reset_index().index 32 33 34for l_checker in df_merge_original_data["cleaned_names"]: 35 #print("=============================================") 36 #print(l_checker) 37 38 for checker in l_checker: 39 #print("-----------") 40 41 #print(checker) 42 last_name = checker.split()[0] 43 first_name = checker.split()[-1] 44 # print("last name:" + last_name) 45 # print("first name:" + first_name) 46 47 mail_picker_words = [ 48 first_name.lower(), 49 last_name.lower(), 50 (first_name[:2]+last_name[:2]).lower(), 51 (last_name[:2]+first_name[:2]).lower() 52 ] 53 54 #print(mail_picker_words) 55 56 df_target_filtered = df_merge_original_data[np.array([df_merge_original_data['email'].str.contains(part) for part in mail_picker_words]).any(axis=0)] #←うまくいかない 57 df_out = pd.merge(df_out, df_target_filtered, on='index', how='outer') 58 59 #print(df_out)
もっときれいに書けるはずなのですが、技量不足でうまくいかず・・・。
ご指導のほど、どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/30 03:17 編集
2021/12/30 05:37
2021/12/30 06:25
2021/12/30 06:37
2021/12/30 06:39
2021/12/30 07:20 編集
2021/12/30 07:24
2021/12/30 14:14
2021/12/30 17:47
2022/01/02 09:24
2022/01/04 01:40 編集
2022/01/04 01:49
2022/01/04 09:31