pandas 将一行拆分为n行,然后将其他列中的行合并为1 [Python]

3pmvbmvn  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(119)

我有这样的记录:

Name .... Email Address
Alex .... alex1@gmail.comalex2@gmail.comalex3@gmail.com
Peter.... peter1@gmail.com

字符串
我想使用panda将1 alex1@gmail.comalex2@www.example.com alex3@gmail.com拆分成3行,然后将空白行Alex(name)合并成1,像这样:gmail.com

Name .... Email Address
     .... alex1@gmail.com
Alex .... alex2@gmail.com
     .... alex3@gmail.com
Peter.... peter1@gmail.com

kqhtkvqz

kqhtkvqz1#

您可以使用正则表达式模式与.split()和方法链接:
代码:

df = (df
      .assign(Email=df["Email Address"].str.split(pat=r"(?<=com)"))
      .explode(column=["Email"])
      .query(expr="~Email.eq('')")
      .drop(columns=["Email Address"])
      .reset_index(drop=True)
      )

print(df)

字符串
输出量:

Name             Email
0   Alex   alex1@gmail.com
1   Alex   alex2@gmail.com
2   Alex   alex3@gmail.com
3  Peter  peter1@yahoo.com

rlcwz9us

rlcwz9us2#

不幸的是,你错过了一些非常重要的信息:

  • 电子邮件是否总是gmail.com?
  • 从来没有分离的特征?

假设答案总是肯定的,我会采用以下解决方案:
1.首先,遍历pandas中的所有行
1.提取姓名和电子邮件地址
1.使用regex在电子邮件地址中查找所有匹配的提取(和降低)名称
1.创建一个包含姓名和提取的电子邮件地址的列表,并创建一个临时数据框架
1.连接所有 Dataframe
由于没有附加示例文件,我尝试创建一个类似的文件,这里是我的解决方案:

import pandas as pd
import re

final_df=pd.DataFrame(columns=["Name","Email"])
email_pattern="@gmail.com"
for index, row in df.iterrows():
    name_pattern=df.loc[index,"Name"].lower()
    email_string=df.loc[index,"Email"].lower()
    match = re.findall(fr'{name_pattern}\d*{email_pattern}', email_string)
    my_list=[[name_pattern.capitalize(),x] for x in match]
    new_df=pd.DataFrame(data=my_list,columns=["Name","Email"])
    final_df=pd.concat([final_df, new_df], axis=0)

字符串
如果它工作,请接受这个解决方案作为你的帖子的答案。
输出数据框:


的数据

相关问题