Tengo un marco de datos de pandas como este.
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN NaN 1 NaN Test 3 C1 C1-T1 2 NaN Test 5- C2 C2-T0 3 NaN Test 5- C2 C2-T1 4 2021-12-01 10:01:46.452 NaN NaN NaN NaNQuiero agregar el valor de la ciudad, que se basa en la fila que tiene el mismo valor de fuente, nivel y condado.
He intentado isin, groupby, diff (pero mi valor es str), pero aún no lo descubro.
La imagen de abajo es lo que quiero obtener.
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN NaN 1 NaN Test 3 C1 C1-T0 2 NaN Test 5- C2 C2-T0, C2-T1 3 2021-12-01 10:01:46.452 NaN NaN NaN NaN¡Realmente aprecio tu ayuda!
La forma en que podemos hacer que esto funcione es creando una lista usando groupby() y apply(list) , luego podemos transformar esto en una cadena separada por comas. Vamos a dividirlo en 2 pasos para una mejor comprensión.
Personalmente, mantendría estos datos como una lista dentro de una serie de pandas y no haría el paso 2. El formateo como una cadena separada por comas podría no ser ideal para trabajar.
Paso 1:
output = df.groupby(['Time','Source','Level','County'])['Town'].apply(list).reset_index()Devoluciones:
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN [nan] 1 2021-12-01 10:01:46.452 NaN NaN NaN [nan] 2 NaN Test 3 C1 [C1-T1] 3 NaN Test 5- C2 [C2-T0, C2-T1]Ahora, podemos formatearlas correctamente en cadenas (paso 2):
output['Town'] = pd.Series([', '.join([y for y in x if type(y) == str]) for x in output['Town']]).replace('',np.nan)Lo que genera nuestro resultado deseado:
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN NaN 1 2021-12-01 10:01:46.452 NaN NaN NaN NaN 2 NaN Test 3 C1 C1-T1 3 NaN Test 5- C2 C2-T0, C2-T1