Pandas:将值拆分并跨列合并

3

我有一份包含用户数据的csv文件,但由于某些原因,该文件将电子邮件名称和电子邮件域名分为两列。同时,有些用户拥有多个电子邮件。我想将它们合并成一个电子邮件或者一个电子邮件列表,视情况而定。

例子:

emailname                          | emaildomain
john.smith; smithj                 | gmail.com, biz.net
sample.name                        | aol.com

我想把那个改为:

email
[john.smith@gmail.com, smithj@biz.net]
[sample.name@aol.com] 

接下来,它将被推送到一个字典中,在那里我将不得不迭代每个单元格中的每个值,并从中创建一个条目,这方面我有一个大致的想法,可以使用基本的Python或遵循类似的逻辑。

我能够使用df['email name'] = df['email name'].str.split(';')将每个字段拆分为列表,这样每个字段的每个值都对应一个列表。然而,我卡在了如何将它们连接成一个单一字段上。

在纯Python中,我会这样做:

emaillist = []
for i in emailname: #where the assumption is there is a 1:1 relationship between each name and domain
    e = '@'.join(emailname[i],emaildomain[i])
    emaillist.append(e)

但在Pandas中,我不确定如何获取数据框单元格中列表的索引。理想情况下,我还想跳过任何空行,但如果只创建一个类似于[@]的“空”列表,那么没关系,我可以稍后解决。

2个回答

2

使用嵌套的列表推导式和 * 来解包列表:

L = [['@'.join(z) for z in zip(*[y.split(',') for y in x])] 
                  for x in zip(df['emailname'],df['emaildomain'])]
print (L)
[['john.smith@gmail.com', 'smithj@biz.net'], ['sample.name@aol.com']]

哦,我尝试了一下,结果出现了 AttributeError: 'list object has no attribute 'split'。我重新做了一遍,没有事先分割多值单元格,结果合并得不正确,变成了 ['john.smith;smithj@gmail.com;biz.net]'。我尝试将 .split(';') 移到列表推导式的第二行,但还是出现了错误:AttributeError: Can only use .str accessor with string values! - nos codemos
@noscodemos - 是否有可能存在缺失值?如果在我的解决方案之前使用 df = df.dropna(),它能正常工作吗? - jezrael
有一些空值,但理论上应该只创建一个带有值[@]的列表。执行dropna()没有任何效果。 - nos codemos
@noscodemos 一个想法 0,你可以测试一下 L = [['@'.join(z) for z in zip(*[y.split(',') for y in x])] for x in zip(df['emailname'].astype(str),df['emaildomain'].astype(str))] 吗? - jezrael

0

你可以尝试这个。它将创建一个新的列“email”,输出为你所需的格式。

final_email = []
for i,k in enumerate(zip(list(df['Emailname'].values), list(df['Emaildomain'].values))):
  name,domain = k
  a = []
  for ij, val in enumerate(name.split(';')):
    val = val+'@'+str(domain.split(',')[ij]).strip()
    a.append(val)
  final_email.append(a)
df['Email'] = final_email
df

我一直收到一个“列表索引超出范围”的错误。 - nos codemos
你是将此应用于整个数据集吗? - Prakash Dahal
只需将这两列内容翻译成中文,一直延伸到底部即可。 - nos codemos
你的emalname和emaildomain的整个值应该与问题中给出的形式相同,否则可能会显示错误。就像这样想象你的数据john.smith, smithj而不是john.smith; smithj。从;更改为,可能会显示错误。这取决于你的数据集。 - Prakash Dahal
好的,那么你能找到是哪一行导致了错误吗?你可以将数据框拆分为许多小型数据框,并在这些数据框中检查上述代码,直到找到导致错误的小型数据框。 - Prakash Dahal
我找到了。其中一个条目少了一个域名,与电子邮件名称不符。修复后,此解决方案有效!谢谢! - nos codemos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接