Sun*_*nni 2 python pandas 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 |
+-----------+----------+-----+
Run Code Online (Sandbox Code Playgroud)
我想计算每个单独的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 |
+-----------+--------------------+
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经编写了以下代码
#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]
Run Code Online (Sandbox Code Playgroud)
下面是我得到的结果。所有项目分开。
+---+---------------------+
| 0 | a,b,b,c |
+---+---------------------+
| 1 | a,a,a,a,b,c,d,d,d,d |
+---+---------------------+
| 2 | b,b,e |
+---+---------------------+
Run Code Online (Sandbox Code Playgroud)
请指导我解决这个问题。
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
Run Code Online (Sandbox Code Playgroud)
你会注意到我不需要排序任何东西。这是因为groupby默认情况下对分组键进行排序,所以在第一行之后,Series 保证按 排序['InvoiceNo', 'ItemCode'],这是我们之前想要的', '.join
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |