【问题标题】:How to append a string from one row to another, based on another duplicate value如何根据另一个重复值将字符串从一行附加到另一行
【发布时间】: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] 但不是 4 np.NaN 只是浮动。
  • 感谢 ALoilz,我给出的输出只是一个示例,在我的真实数据集中,我正在尝试组合标签号,因此输出将显示为 tag1, tag2, tag3, tag4。当我删除重复的行时,我宁愿不要丢失标签数据。

标签: python pandas duplicates data-cleaning


【解决方案1】:

这是你想要的吗?

customers=df["Customer"].unique().tolist()
List=[]

for customer in customers: 
    List.append(df.loc[df["Customer"]==customer,"Contact"].tolist())

df=df.drop_duplicates("Customer",keep="first")
df["new"]=List

输出

Out[10]: 
     ID    Customer  ...        Contact                             new
0  1234  Customer A  ...            NaN            [nan, nan, nan, nan]
4  1233  Customer B  ...            NaN       [nan, nan, abc@email.com]
7  1235  Customer C  ...  abc@email.com  [abc@email.com, abc@email.com]

[3 rows x 6 columns]

【讨论】:

  • 我想就是这样!谢谢,一个更好的解决方案!
猜你喜欢
  • 2023-03-17
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2011-05-25
相关资源
最近更新 更多