去除重复项并使用Python Pandas添加一些列

3

使用Python Pandas可以完成以下操作吗?

我有一个csv文件,类似于表A。

TABLE A
------------------------------------------------
Name               Email
------------------------------------------------
Hinckley Joel      hjoel@mail.com
Hinckley Joel      hjoel@mail.com 
Hinckley Joel      hinkleyjoel@mail.com
Joel Hinckley      hinkjoel@mail.com
Siegel Allison     sallison@mail.com
Nielsen Tami       ntami@mail.com
Nielsen Tami       ntami@gmail.com
...

我想要去除重复姓名的行,并添加一个名为“Secondary Email”的新列。
次要电子邮件将是具有重复行的第一个电子邮件。

我要制作的最终表格是表B。

TABLE B
-----------------------------------------------------------
Name               Email                   Secondary Email
-----------------------------------------------------------
Hinckley Joel      hjoel@mail.com          hinkleyjoel@mail.com
Siegel Allison     sallison@mail.com
Nielsen Tami       ntami@mail.com

从表A和B可以看出,即使名字的顺序不同(例如:“Hinckley Joel”和“Joel Hinckley”),我仍希望将其视为同一人。
此外,我想将第二电子邮件地址(例如:hinkleyjoel@mail.com)添加到新列中。

提前感谢您。

3个回答

4

这是使用两列进行透视,但您需要删除重复项:

(df.drop_duplicates()
   .assign(col=lambda x: x.groupby("Name").cumcount())
   .pivot(index='Name', columns='col', values='Email')
   .add_prefix('Email_').reset_index()
)

输出:

col            Name            Email_0               Email_1
0     Hinckley Joel     hjoel@mail.com  hinkleyjoel@mail.com
1     Joel Hinckley  hinkjoel@mail.com                   NaN
2      Nielsen Tami     ntami@mail.com       ntami@gmail.com
3    Siegel Allison  sallison@mail.com                   NaN

感谢您的快速回复,Quang Hoang。但是你的输出表格与表B有点不同。我想删除“Joel Hinckley”,因为他和“Hinckley Joel”是同一个人。您有什么好的想法吗? - Shi J
@ShiJ,你怎么知道它们是相同的?根据名字不同的顺序吗?那么像“Cohen Thompson”这样既可以作为名字又可以作为姓氏的名字呢? :-) - Quang Hoang
几乎所有的名称都应该由名字和姓氏组成。如果名称包含任何中间名,我们将忽略它们。 - Shi J

2
不像 @QuangHoang 的样子那么美观整洁,但是概念相同。
df_dup = df.drop_duplicates()
df_out = df_dup.set_index(['Name', df_dup.groupby('Name')['Email'].cumcount()])
df_out = df_out.unstack()
df_out.columns = [f'Secondary Email' if j != 0 else f'{i}' for i, j in df_out.columns]
df_out.reset_index()

输出:

            Name              Email       Secondary Email
0   Hinckley Joel     hjoel@mail.com  hinkleyjoel@mail.com
1   Joel Hinckley  hinkjoel@mail.com                   NaN
2    Nielsen Tami     ntami@mail.com       ntami@gmail.com
3  Siegel Allison  sallison@mail.com                   NaN

0
通过使用重复项简单掩码合并: 但首先,删除重复行,因为两行可能具有相同的名称和电子邮件,正如您在问题中提到的那样。
df.drop_duplicates(inplace=True)
duplicates = df['Name'].duplicated()
df[~duplicates].merge(df[duplicates].drop_duplicates(subset=['Name']).rename(columns={'email':'second email'}), how='left')

               Name            email               second email
0     Hinckley Joel     hjoel@mail.com  hinkleyjoel@mail.com
1     Joel Hinckley  hinkjoel@mail.com                   NaN
2      Nielsen Tami     ntami@mail.com       ntami@gmail.com

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