J'ai les données suivantes:
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
J'essaie de faire un groupby donc j'ai l'opération suivante:
df.groupby(['InvoiceNo','CustomerID','Country'])['NoStockCode','Description','Quantity'].apply(list)
Je veux obtenir la sortie
|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
Au lieu de cela, je reçois:
|Invoice |CustomerID |Country |0
|536365| |17850 |United Kingdom |['NoStockCode','Description','Quantity']
J'ai essayé l'agg et d'autres méthodes, mais je n'ai pas réussi à joindre toutes les colonnes en tant que liste. Je n'ai pas besoin d'utiliser la fonction de liste, mais au final je veux que les différentes colonnes soient des listes.
Je ne peux pas reproduire votre code pour le moment, mais je pense que:
print (df.groupby(['InvoiceNo','CustomerID','Country'],
as_index=False)['NoStockCode','Description','Quantity']
.agg(lambda x: list(x)))
vous donnerait la sortie attendue
Vous pouvez utiliser pd.pivot_table
avec 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)
les rendements
Description NoStockCode Quantity
Invoice CustomerID Country
536365 17850 United Kingdom WHITE HANGING HEART T-LIGHT HOLDER, WHITE META... 85123A, 71053, 84406B 6, 6, 8
Notez que si Quantity
sont int
s, vous devrez les convertir en str
s avant d'appeler ', '.join
. C'est pourquoi map(str, x)
a été utilisé ci-dessus.
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
Essayez d'utiliser une variante des éléments suivants:
df.groupby('company').product.agg([('count', 'count'), ('NoStockCode', ', '.join), ('Descrption', ', '.join), ('Quantity', ', '.join)])