2 回答
TA贡献1805条经验 获得超9个赞
groupby两次。第一个获得每个的总和['InvoiceNo', 'ItemCode']。然后我们将代码和类别与“-”连接在一起,并对发票进行分组以创建完整的字符串。
df1 = df.groupby(['InvoiceNo', 'ItemCode'])['Qty'].sum().reset_index('ItemCode')
df1 = df1['ItemCode'].str.cat(df1['Qty'].astype(str), '-').groupby(level=0).agg(', '.join)
#InvoiceNo
#Inv-001 a-1, b-2, c-1
#Inv-002 a-4, b-1, c-1, d-4
#Inv-003 b-2, e-1
#Name: ItemCode, dtype: object
你会注意到我不需要整理任何东西。这是因为groupby默认情况下对分组键进行排序,所以在第一行之后系列保证按 排序['InvoiceNo', 'ItemCode'],这是我们之前想要的', '.join
TA贡献1934条经验 获得超2个赞
干得好:
df1 = df.groupby(['InvoiceNo', 'ItemCode'], sort=False).Qty.sum().reset_index()
df1['Desired result'] = df1.ItemCode + '-' + df1.Qty.astype(str)
print(df1.groupby(['InvoiceNo'])['Desired result'].apply(lambda res: ', '.join(sorted(res))).reset_index())
输出:
InvoiceNo Desired result
0 Inv-001 a-1, b-2, c-1
1 Inv-002 a-4, b-1, c-1, d-4
2 Inv-003 b-2, e-1
添加回答
举报