Estoy tratando de crear un método escalable para calcular la cantidad de miembros únicos que han modificado un determinado archivo hasta la última fecha de modificación inclusive. La columna unique_member_until_now contiene el resultado esperado para cada archivo.
import pandas as pd from pandas import Timestamp # Example Dataset df = pd.DataFrame({'File': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C'], 'Member': ['X', 'X', 'Y', 'X', 'Y', 'Y', 'X', 'Z', 'Y', 'X', 'Y', 'X'], 'modified_date': [Timestamp('2021-11-25 00:00:00'), Timestamp('2021-11-28 00:00:00'), Timestamp('2021-12-14 00:00:00'), Timestamp('2021-10-17 00:00:00'), Timestamp('2021-11-01 00:00:00'), Timestamp('2021-11-04 00:00:00'), Timestamp('2021-11-16 00:00:00'), Timestamp('2021-12-16 00:00:00'), Timestamp('2021-12-29 00:00:00'), Timestamp('2021-10-30 00:00:00'), Timestamp('2021-11-23 00:00:00'), Timestamp('2021-12-17 00:00:00')], 'unique_member_until_now': [1, 1, 2, 1, 2, 2, 2, 3, 3, 1, 2, 2]}) df.groupby("File")["Member"].transform('nunique') supuesto no da el resultado esperado
El enfoque actual es iterar sobre cada grupo y cada registro en el grupo, pero estoy seguro de que es extremadamente ineficiente y lento cuando se trata de filas de millones.
Puede agrupar por File y luego usar is_duplicated (invertido con ~ ) + cumsum :
df['unique_member_until_now'] = df.groupby('File').apply(lambda g: (~g['Member'].duplicated()).cumsum()).droplevel(0)Producción:
>>> df File Member modified_date unique_member_until_now 0 AX 2021-11-25 1 1 AX 2021-11-28 1 2 AY 2021-12-14 2 3 BX 2021-10-17 1 4 BY 2021-11-01 2 5 BY 2021-11-04 2 6 BX 2021-11-16 2 7 BZ 2021-12-16 3 8 BY 2021-12-29 3 9 CX 2021-10-30 1 10 CY 2021-11-23 2 11 CX 2021-12-17 2Un método eficiente sería calcular el (no) duplicated en las columnas Archivo+Miembro, luego groupby Archivo y cumsum :
(~df[['File', 'Member']].duplicated()).groupby(df['File']).cumsum()Guardando como columna:
df['unique_member_until_now'] = (~df[['File', 'Member']].duplicated()).groupby(df['File']).cumsum()producción:
File Member modified_date unique_member_until_now 0 AX 2021-11-25 1 1 AX 2021-11-28 1 2 AY 2021-12-14 2 3 BX 2021-10-17 1 4 BY 2021-11-01 2 5 BY 2021-11-04 2 6 BX 2021-11-16 2 7 BZ 2021-12-16 3 8 BY 2021-12-29 3 9 CX 2021-10-30 1 10 CY 2021-11-23 2 11 CX 2021-12-17 2