Как добавить строку из одной строки в другую, основываясь на другом дублирующем значении - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть набор данных с несколькими повторяющимися полями 'Email', который я хотел бы использовать в качестве уникального идентификатора. Однако каждый дубликат содержит уникальную информацию о пользовательских тегах, которые я хотел бы скомпилировать и сохранить перед удалением.

ПРИМЕР:

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

Я хочу объединить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)

Есть мысли здесь? Спасибо!

1 Ответ

0 голосов
/ 12 декабря 2019

Это то, что вы хотели?

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...