熊猫聚合

时间:2017-01-16 18:18:01

标签: python pandas

我是Pandas的新手并且已经将它用于班级,但我当然不会精通Panda。

假设我有一个数据框:

accord = pd.Series({'Manufacturer' : 'Honda',
                'Model' : 'Accord',
                'Drivetrain': 'FWD'})

civic = pd.Series({'Manufacturer' : 'Honda',
                    'Model' : 'Civic',
                    'Drivetrain': 'FWD'})


focus = pd.Series({'Manufacturer' : 'Ford',
                    'Model' : 'Focus',
                    'Drivetrain': 'FWD'})

mustang = pd.Series({'Manufacturer' : 'Ford',
                    'Model' : 'Mustang',
                    'Drivetrain': 'RWD'})

cars_df = pd.DataFrame([accord, civic, focus, mustang])

我最终想要获得的是一份清单,其中包括每个制造商的总模型以及他们制造的前轮驱动车辆的数量。

所以,我拿出一个系列并制作一个新的数据框:

manufacturer_s = cars_df['Manufacturer'].unique()
manufacturer_df = pd.DataFrame(index=manufacturer_s)

我为我寻求的信息添加空列:

manufacturer_df['FWD MODEL COUNT'] = 0
manufacturer_df['MODEL COUNT'] = 0

我使用'iterrows'来填充这些数据:

for manufacturer, row in manufacturer_df.iterrows():
    row['MODEL COUNT'] = 
          len(cars_df[cars_df['Manufacturer'] == manufacturer])
    row['FWD MODEL COUNT'] =  
          len(cars_df[(cars_df['Manufacturer'] == manufacturer) &
                      (cars_df['Drivetrain'] == 'FWD')])

现在,我的输出如下:

       FWD MODEL COUNT  MODEL COUNT
Honda                2            2
Ford                 1            2

(编辑:我发现了一个拼写错误,所以这部分确实有效)现在,这不仅是冗长的(并且可能很慢),但它并不觉得非常“熊猫式”。

或者,我尝试了以下内容:

manufacturer_df['MODEL COUNT'] = manufacturer_df.apply(lambda car: 
         len(cars_df[cars_df['Manufacturer'] == car.index]), axis=1)
manufacturer_df['FWD MODEL COUNT'] = manufacturer_df.apply(lambda car: 
   len(cars_df[(cars_df['Manufacturer'] == car.index) & 
               (cars_df['Drivetrain'] == 'FWD')]), axis=1)

这根本不起作用......那么,我该怎么做呢?(另外)我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以使用groupby().agg(),在其中您可以使用不同的聚合函数汇总每个列。您可以使用pd.Series.nunique计算每个制造商的唯一模型,并通过计算每组x == "FWD"中的真实数量来计算FWD车辆的总数:

(cars_df.groupby("Manufacturer").agg({"Model": "nunique",     
                                      "Drivetrain": lambda x: (x == "FWD").sum()}))

#              Model    Drivetrain
#Manufacturer       
#       Ford       2             1
#      Honda       2             2