Pandas:使用多个GroupBy结果创建一个新的数据框

2024-04-28 10:03:01 发布

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

我的数据是一个包含零售商品及其销售业绩的数据框架。列包括:2016年单位销售额、2015年单位销售额、商品描述等。当我尝试为品牌进行分组时:

Data.groupby(by="Major Brand").sum()

我得到以下错误:TypeError: unorderable types: int() < str()

我认为这是因为数据帧中的数据不是全部都是数字,因此熊猫不知道如何“求和”。在

但我可以让单独的groupby使用类似于:

^{pr2}$

最后,我只想按“主要品牌”分组,将“2016年单位”与“2015年单位”进行比较,并将这三个单位放入一个以“主要品牌”为索引的新数据框中。在

我试过把我的多个groupby合并在一起,但这似乎不起作用。在

谢谢你!在


Tags: 数据框架databy错误单位商品sum
2条回答

你可以这样做:

Data.groupby(by="Major Brand")["2016 Units","2015 Units"].sum()

演示:

^{pr2}$

数据:

In [30]: Data
Out[30]:
    Major Brand  2016 Units  2015 Units    X
0             1          75          83  xxx
1             1          82          95  xxx
2             3          85          47  xxx
3             3           1          40  xxx
4             1          43          43  xxx
5             4          35          65  xxx
6             3          38          71  xxx
7             4          56          90  xxx
8             3           9          77  xxx
9             1          18          17  xxx
10            3          59          38  xxx
11            4          85          17  xxx
12            2          64          13  xxx
13            2          32          33  xxx
14            2          76          76  xxx

I get the following error: TypeError: unorderable types: int() < str()

是不是你的数据类型不正确?例如str.而不是int? 您可以尝试使用以下内容创建数据帧:

In [18]: import numpy as np; import pandas as pd

In [19]: col1 = ['adidas','nike','yourturn','zara','nike','nike','bla','bla','zalando','amazon']

In [20]: data = {'Major Brand':col1, '2016 Units':range(len(col1)), '2015 Units':range(len(col1),len(col1)*2)}

In [21]: x = pd.DataFrame(data, dtype=np.int64  )

In [22]: 

In [22]: x.groupby(by="Major Brand").sum()
Out[22]: 
             2015 Units  2016 Units
Major Brand                        
adidas               10           0
amazon               19           9
bla                  33          13
nike                 40          10
yourturn             12           2
zalando              18           8
zara                 13           3

In [23]: x.groupby(by="Major Brand")["2016 Units","2015 Units"].sum()
Out[23]: 
             2016 Units  2015 Units
Major Brand                        
adidas                0          10
amazon                9          19
bla                  13          33
nike                 10          40
yourturn              2          12
zalando               8          18
zara                  3          13

In [24]: x.dtypes
Out[24]: 
2015 Units      int64
2016 Units      int64
Major Brand    object
dtype: object

In [25]: x.groupby(by="Major Brand").agg(['count','sum','mean','median'])
Out[25]: 
            2015 Units                       2016 Units                     
                 count sum       mean median      count sum      mean median
Major Brand                                                                 
adidas               1  10  10.000000   10.0          1   0  0.000000    0.0
amazon               1  19  19.000000   19.0          1   9  9.000000    9.0
bla                  2  33  16.500000   16.5          2  13  6.500000    6.5
nike                 3  40  13.333333   14.0          3  10  3.333333    4.0
yourturn             1  12  12.000000   12.0          1   2  2.000000    2.0
zalando              1  18  18.000000   18.0          1   8  8.000000    8.0
zara                 1  13  13.000000   13.0          1   3  3.000000    3.0

相关问题 更多 >