【发布时间】:2020-04-05 01:19:29
【问题描述】:
我有一个包含多个重复“电子邮件”字段的数据集,我想将其用作唯一 ID。但是,每个副本都包含有关用户“标签”的唯一信息,我想在删除之前编译并保留这些信息。
示例:
import pandas as pd
import numpy as np
df = pd.DataFrame([[1234, 'Customer A', '123 Street', np.nan, np.nan],
[1234, 'Customer A', np.nan, '333 Street', np.nan],
[1234, 'Customer A', '12345 Street', np.nan, np.nan],
[1234, 'Customer A', np.nan, np.nan, np.nan],
[1233, 'Customer B', '444 Street', '3335 Street', np.nan],
[1233, 'Customer B', '555 Street', '666 Street', np.nan],
[1233, 'Customer B', '553 Street', '666 Street', 'abc@email.com'],
[1235, 'Customer C', '1553 Street', '644 Street', 'abc@email.com'],
[1235, 'Customer C', '2553 Street', '644 Street', 'abc@email.com']],
columns=['ID', 'Customer', 'Billing Address', 'Shipping Address', 'Contact'])
df.head()
ID Customer Billing Address Shipping Address Contact
0 1234 Customer A 123 Street NaN NaN
1 1234 Customer A NaN 333 Street NaN
2 1234 Customer A 12345 Street NaN NaN
3 1234 Customer A NaN NaN NaN
4 1233 Customer B 444 Street 3335 Street NaN
我想将标记为“客户 A”的每一行的 Contact 信息合并到最后一行,以 , 分隔,最终结果将是 NaN, NaN, NaN, NaN(或每个字符串中包含的任何其他字符串数据)字段,只是合并并由一列分隔)。
这是我尝试过的,但必须有一个更优雅的解决方案。
按Email字段排序后:
def row_clean(df):
for i in range(0, len(df)-1):
if df.loc[i,'Customer'] == np.NaN:
return df
elif df.loc[i,'Customer'] == df.loc[(i+1),'Customer']:
df.loc[(i+1),'Contact'] = str(df.loc[(i+1),'Contact']) + ', ' + str(df.loc[i,'Contact'])
return df
row_clean(df)
这里有什么想法吗?谢谢!
【问题讨论】:
-
我很确定输出
NaN, NaN, NaN, NaN是不可能的。您可以让字符串'NaN, NaN, NaN, NaN'(每个值不再被识别为 null)或列表[np.nan, np.nan, np.nan, np.nan]但不是 4np.NaN只是浮动。 -
感谢 ALoilz,我给出的输出只是一个示例,在我的真实数据集中,我正在尝试组合标签号,因此输出将显示为
tag1, tag2, tag3, tag4。当我删除重复的行时,我宁愿不要丢失标签数据。
标签: python pandas duplicates data-cleaning