pandas Groupby 求和并连接

我有一个数据框如下


+-----------+----------+-----+

| 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 data

df = pd.read_excel('data.xlsx')


#groupby and sum

g = df.groupby(['InvoiceNo','ItemCode']).sum()


# Codes to convert the MultiIndex to a regualr dataframe

g = g.unstack(fill_value=0)

g.reset_index(drop=True,inplace=True)

g = g.droplevel(level=0, axis=1).fillna(0)


#calculation

g.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        |

+---+---------------------+

请指导我解决这个问题。


慕虎7371278
浏览 156回答 2
2回答

Cats萌萌

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

撒科打诨

干得好: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 result0   Inv-001       a-1, b-2, c-11   Inv-002  a-4, b-1, c-1, d-42   Inv-003            b-2, e-1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python