Grupo de pandas por columnas múltiples, lista de columnas múltiples

Tengo los siguientes datos:

Invoice NoStockCode Description Quantity CustomerID Country 536365 85123A WHITE HANGING HEART T-LIGHT HOLDER 6 17850 United Kingdom 536365 71053 WHITE METAL LANTERN 6 17850 United Kingdom 536365 84406B CREAM CUPID HEARTS COAT HANGER 8 17850 United Kingdom 

Estoy tratando de hacer un groupby, así que tengo la siguiente operación:

 df.groupby(['InvoiceNo','CustomerID','Country'])['NoStockCode','Description','Quantity'].apply(list) 

Quiero obtener la salida

 |Invoice |CustomerID |Country |NoStockCode |Description |Quantity |536365| |17850 |United Kingdom |85123A, 71053, 84406B |WHITE HANGING HEART T-LIGHT HOLDER, WHITE METAL LANTERN, CREAM CUPID HEARTS COAT HANGER |6, 6, 8 

En su lugar me sale:

 |Invoice |CustomerID |Country |0 |536365| |17850 |United Kingdom |['NoStockCode','Description','Quantity'] 

He intentado agg y otros métodos, pero no he podido hacer que todas las columnas se unan como una lista. No necesito usar la función de lista, pero al final quiero que las diferentes columnas sean listas.

No puedo reproducir tu código en este momento, pero creo que:

 print (df.groupby(['InvoiceNo','CustomerID','Country'], as_index=False)['NoStockCode','Description','Quantity'] .agg(lambda x: list(x))) 

te daría la salida esperada

IIUC

 df.groupby(['Invoice','CustomerID'],as_index=False)['Description','NoStockCode'].agg(','.join) Out[47]: Invoice CustomerID Description \ 0 536365 17850 WHITEHANGINGHEARTT-LIGHTHOLDER,WHITEMETALANTER... NoStockCode 0 85123A,71053,84406B 

Intente usar una variación de lo siguiente:

 df.groupby('company').product.agg([('count', 'count'), ('NoStockCode', ', '.join), ('Descrption', ', '.join), ('Quantity', ', '.join)]) 

Podría usar pd.pivot_table con aggfunc=list :

 import pandas as pd df = pd.DataFrame({'Country': ['United Kingdom', 'United Kingdom', 'United Kingdom'], 'CustomerID': [17850, 17850, 17850], 'Description': ['WHITE HANGING HEART T-LIGHT HOLDER', 'WHITE METAL LANTERN', 'CREAM CUPID HEARTS COAT HANGER'], 'Invoice': [536365, 536365, 536365], 'NoStockCode': ['85123A', '71053', '84406B'], 'Quantity': [6, 6, 8]}) result = pd.pivot_table(df, index=['Invoice','CustomerID','Country'], values=['NoStockCode','Description','Quantity'], aggfunc=lambda x: ', '.join(map(str, x))) print(result) 

rendimientos

  Description NoStockCode Quantity Invoice CustomerID Country 536365 17850 United Kingdom WHITE HANGING HEART T-LIGHT HOLDER, WHITE META... 85123A, 71053, 84406B 6, 6, 8 

Tenga en cuenta que si Quantity es int s, deberá convertirlos a str s antes de llamar ', '.join . Es por eso que el map(str, x) fue usado arriba.