¡Actualice a continuación!
Estoy tratando de fusionar y ordenar una lista de ID y su Name_ID único conectado, separados por punto y coma. Por ejemplo:
Name_ID Adress_ID Name_ID Adress_ID
Name1 5875383 Name1 5875383; 5901847
Name1 5901847 Name2 5285200
Name2 5285200 to Name3 2342345; 6463736
Name3 2342345
Name3 6463736
Este es mi código actual:
origin_file_path = Path("Folder/table.xlsx")
dest_file_path = Path("Folder/table_sorted.xlsx")
table = pd.read_excel(origin_file_path)
df1 = pd.DataFrame(table)
df1 = df1.groupby('Name_ID').agg(lambda x: x.tolist())
df1.to_excel(dest_file_path, sheet_name="Adress_IDs")
Pero lo exporta así al archivo de Excel:
Name_ID Adress_ID
Name1 [5875383, 5901847]
¿Alguien puede decirme cuál sería la mejor manera de deshacerse del formato de lista y separarlo con punto y coma en lugar de comas?
Actualización:
El usuario Jezrael me vinculó esto thread. Pero parece que no puedo combinar ';'.join
con lambda x: x.tolist()
.
df1 = df1.groupby('Kartenname').agg(';'.join, lambda x: x.tolist())
Produce TypeError: join () toma exactamente un argumento (2 dados)
df1 = df1.groupby('Kartenname').agg(lambda x: x.tolist(), ';'.join)
Produce TypeError: () toma 1 argumento posicional pero se dieron 2.
También probé otras combinaciones, pero ninguna parece ejecutarse correctamente. Deshacerse de la función lambda no es una opción porque simplemente pega Name_ID Adress_ID mil veces en lugar del nombre correcto y las ID correctas.
3 respuestas
Puede pasar a agg
tuplas de función con nuevos nombres de columna con funciones agregadas:
df['Adress_ID'] = df['Adress_ID'].astype(str)
df1 = df.groupby('Name_ID')['Adress_ID'].agg([('a', ';'.join),
('b', lambda x: x.tolist())])
print (df1)
a b
Name_ID
Name1 5875383;5901847 [5875383, 5901847]
Name2 5285200 [5285200]
Name3 2342345;6463736 [2342345, 6463736]
Si pasa solo funciones agregadas en la lista (sin tuplas), obtenga los nombres de columnas predeterminados:
df2 = df.groupby('Name_ID')['Adress_ID'].agg([ ';'.join,lambda x: x.tolist()])
print (df2)
join <lambda_0>
Name_ID
Name1 5875383;5901847 [5875383, 5901847]
Name2 5285200 [5285200]
Name3 2342345;6463736 [2342345, 6463736]
- El problema principal
- No puedo
join
unaint
- No puedo
Name_ID Adress_ID
Name1 5875383
Name1 5901847
Name2 5285200
Name3 2342345
Name3 6463736
def fix_my_stuff(x):
x = x.tolist()
x = '; '.join([str(y) for y in x])
return(x)
df_updated = df.groupby('Name_ID').agg(lambda x: fix_my_stuff(x)).reset_index()
print(df_updated)
Name_ID Adress_ID
Name1 5875383; 5901847
Name2 5285200
Name3 2342345; 6463736
Primero debe asegurarse de que Address_ID
sea string
Entonces puedes aplicar esta función:
df.groupby('Name_ID').agg(lambda x: ':'.join(list(x.values)))
Más sobre 'str'.join
método
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.