У меня есть следующие данные:
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
Я пытаюсь сделать группу, поэтому у меня есть следующая операция:
df.groupby(['InvoiceNo','CustomerID','Country'])['NoStockCode','Description','Quantity'].apply(list)
Я хочу получить результат
|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
Вместо этого я получаю:
|Invoice |CustomerID |Country |0
|536365| |17850 |United Kingdom |['NoStockCode','Description','Quantity']
Я пробовал agg и другие методы, но мне не удалось получить все столбцы для объединения в список. Мне не нужно использовать функцию списка, но в конце я хочу, чтобы разные столбцы были списками.
Я не могу воспроизвести ваш код прямо сейчас, но я думаю, что:
print (df.groupby(['InvoiceNo','CustomerID','Country'],
as_index=False)['NoStockCode','Description','Quantity']
.agg(lambda x: list(x)))
даст вам ожидаемый результат
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
Вы можете использовать pd.pivot_table
с 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)
доходность
Description NoStockCode Quantity
Invoice CustomerID Country
536365 17850 United Kingdom WHITE HANGING HEART T-LIGHT HOLDER, WHITE META... 85123A, 71053, 84406B 6, 6, 8
Обратите внимание, что если Quantity
является int
s, вам нужно будет преобразовать их в str
перед вызовом ', '.join
. Вот почему map(str, x)
использовалась выше.
Попробуйте использовать следующие варианты:
df.groupby('company').product.agg([('count', 'count'), ('NoStockCode', ', '.join), ('Descrption', ', '.join), ('Quantity', ', '.join)])
list
вводит в заблуждение, потому что, если вы посмотрите на ответ @ Wen, использование другого метода (например,', '.join
) сработает, когда вы впервые попробуете