为了账号安全,请及时绑定邮箱和手机立即绑定

pandas Groupby 求和并连接

pandas Groupby 求和并连接

慕虎7371278 2023-03-30 16:21:16
我有一个数据框如下+-----------+----------+-----+| InvoiceNo | ItemCode | Qty |+-----------+----------+-----+|  Inv-001  |     c    |  1  |+-----------+----------+-----+|  Inv-001  |     b    |  2  |+-----------+----------+-----+|  Inv-001  |     a    |  1  |+-----------+----------+-----+|  Inv-002  |     a    |  3  |+-----------+----------+-----+|  Inv-002  |     b    |  1  |+-----------+----------+-----+|  Inv-002  |     c    |  1  |+-----------+----------+-----+|  Inv-002  |     d    |  4  |+-----------+----------+-----+|  Inv-002  |     a    |  1  |+-----------+----------+-----+|  Inv-003  |     e    |  1  |+-----------+----------+-----+|  Inv-003  |     b    |  2  |+-----------+----------+-----+我想计算每个单独的InvoiceNo明智项目组合。即每个的总和ItemCode。排序并连接到一个字符串。注意:在Inv-002产品中a有 2 行。我想要/需要的输出如下+-----------+--------------------+| InvoiceNo |   Desired result   |+-----------+--------------------+|  Inv-001  |    a-1, b-2, c-1   |+-----------+--------------------+|  Inv-002  | a-4, b-1, c-1, d-4 |+-----------+--------------------+|  Inv-003  |      b-2, e-1      |+-----------+--------------------+到目前为止我已经写了下面的代码#load datadf = pd.read_excel('data.xlsx')#groupby and sumg = df.groupby(['InvoiceNo','ItemCode']).sum()# Codes to convert the MultiIndex to a regualr dataframeg = g.unstack(fill_value=0)g.reset_index(drop=True,inplace=True)g = g.droplevel(level=0, axis=1).fillna(0)#calculationg.dot(g.columns+',').str[:-1]下面是我得到的结果。所有项目分开。+---+---------------------+| 0 |       a,b,b,c       |+---+---------------------+| 1 | a,a,a,a,b,c,d,d,d,d |+---+---------------------+| 2 |        b,b,e        |+---+---------------------+请指导我解决这个问题。
查看完整描述

2 回答

?
Cats萌萌

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


查看完整回答
反对 回复 2023-03-30
?
撒科打诨

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


查看完整回答
反对 回复 2023-03-30
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信