我是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)
这根本不起作用......那么,我该怎么做呢?(另外)我做错了什么?
答案 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