pandas中的Groupby数据

2024-06-13 01:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个数据集上应用了groupby,如下所示:

dc = d.groupby(['Kit Status','kit_type'])['transaction_no'].count()

上面的输出如下所示:

Kit Status  kit_type
Onsite      Crate        84
            FLC          70
            PP Box       91
Return      Crate        49
            FLC          96
            PP Box      141
Name: transaction_no, dtype: int64

如何从上述占用的数据中创建一个水平而非垂直的新数据帧

预期产出:

Product    Allotment    Onsite    Return
Crate      133          84         49
FLC        166          70         96
PP Box     232          91         141   

其中AllotmentonsiteReturn之和


Tags: 数据noboxreturntypestatuskitpp
2条回答

如果使用count,则使用transaction_no列中的计数值来排除缺少的值

第一级MultiIndex使用^{}

dc = (d.groupby(['Kit Status','kit_type'])['transaction_no']
       .count()
       .rename_axis([None,'Product'])
       .unstack(0)
       .reset_index())
       

如果要计数,则所有值都包括缺少的值(如果存在):

dc = (pd.crosstab(d['kit_type'], d['Kit Status'])
        .rename_axis(index='Product', columns=None)
        .reset_index())

列的第一个位置的新和列的最后一个使用^{}

dc.insert(0, 'Allotment', dc.sum(axis=1))
print (dc)

从一个系列(类似于讨论中的一个),如下所示:

Kit Status  kit_type
Onsite      Crate        84
            FLC          70
            PP Box       91
Return      Crate        49
            FLC          96
            PP Box      141
Name: transaction_no, dtype: int64

您可以使用crosstab

dc = df.to_frame().reset_index()

res = pd.crosstab(dc['kit_type'], dc['Kit Status'], dc['transaction_no'], aggfunc='sum', margins=True,
                  margins_name='Allotment').drop('Allotment')

print(res)

输出

Kit Status  Onsite  Return  Allotment
kit_type                             
Crate           84      49        133
FLC             70      96        166
PP Box          91     141        232

相关问题 更多 >