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

У меня есть df, который выглядит примерно так, за исключением того, что количество столбцов материала увеличивается до material_19, а количество клиентов превышает 1000.

Client_ID  Visit_DT   material_1  material_2  material_3  material_4
C001       2019-01-01 1           0           1           0
C002       2019-01-05 0           1           0           0
C003       2019-01-10 1           0           1           0
C001       2019-01-15 1           0           0           1
C002       2019-01-20 1           1           1           0

Если материал используется более чемодин раз одним и тем же клиентом в разные даты (обозначенные 1 в одном и том же столбце material в нескольких строках для одного и того же Client_ID), я хотел бы установить все значения в этом столбце material равнымидо 0 в тех строках, где произошло это дублирование, за исключением значения в первой дублированной строке.Полученный df должен выглядеть так:

Client_ID  Visit_DT   material_1  material_2  material_3  material_4
C001       2019-01-01 1           0           1           0
C002       2019-01-05 0           1           0           0
C003       2019-01-10 1           0           1           0
C001       2019-01-15 0           0           0           1
C002       2019-01-20 1           0           1           0

1 Ответ

1 голос
/ 01 мая 2019
material_cols = ['material_1', 'material_2', 'material_3', 'material_4']
mask = df.groupby('Client_ID').cumsum() == 1
df[material_cols] = df[material_cols]*mask

Что приводит к

df
Out[27]: 
  Client_ID    Visit_DT  material_1  material_2  material_3  material_4
0      C001  2019-01-01           1           0           1           0
1      C002  2019-01-05           0           1           0           0
2      C003  2019-01-10           1           0           1           0
3      C001  2019-01-15           1           0           0           1
4      C002  2019-01-20           1           1           1           0
material_cols = ['material_1', 'material_2', 'material_3', 'material_4']
mask = df.groupby('Client_ID').cumsum() == 1
df[material_cols] = df[material_cols] * mask
df
Out[29]: 
  Client_ID    Visit_DT  material_1  material_2  material_3  material_4
0      C001  2019-01-01           1           0           1           0
1      C002  2019-01-05           0           1           0           0
2      C003  2019-01-10           1           0           1           0
3      C001  2019-01-15           0           0           0           1
4      C002  2019-01-20           1           0           1           0

Примечание. В зависимости от вашего DataFrame вы можете заменить df[material_cols] на df.iloc[:, 2:]

...