使用 Pandas 系列中的 group_by 计算填充 Pandas 数据框

Populate Pandas dataframe with group_by calculations made in Pandas series

我从字典中创建了一个数据框,如下所示:

my_dict = {'VehicleType':['Truck','Car','Truck','Car','Car'],'Colour':['Green','Green','Black','Yellow','Green'],'Year':[2002,2014,1975,1987,1987],'Frequency': [0,0,0,0,0]}

df = pd.DataFrame(my_dict)

所以我的数据框 df 目前看起来像这样:

  VehicleType  Colour  Year  Frequency
0       Truck   Green  2002          0
1         Car   Green  2014          0
2       Truck   Black  1975          0
3         Car  Yellow  1987          0
4         Car   Green  1987          0

我希望它看起来像这样:

  VehicleType  Colour  Year  Frequency
0       Truck   Green  2002          1
1         Car   Green  2014          2
2       Truck   Black  1975          1
3         Car  Yellow  1987          1
4         Car   Green  1987          2

即频率列应代表车辆类型和颜色组合的总和(但不包括年份列)。因此,例如在第 4 行中,频率列中的 2 告诉您共有 2 行包含 'Car' 和 'Green'.

的组合

这本质上是一个'Count'和'Group By'的计算,Pandas提供了一种计算方式如下:

grp_by_series = df.groupby(['VehicleType', 'Colour']).size()

grp_by_series

VehicleType  Colour
Car          Green     2
             Yellow    1
Truck        Black     1
             Green     1
dtype: int64

接下来我想做的是从 Panda 系列中提取计算出的 group_by 值,并将它们放入 Pandas 数据框的频率列中。我尝试了各种方法但没有成功。

我给出的例子已经大大简化了——我使用的数据框来自基因组数据,有数亿行,并且将有几个基于其他列的各种组合的频率列,所以理想情况下我需要一个快速且可扩展的解决方案。

感谢您的帮助!

我认为 .transform() 可以满足您的要求:

df['Frequency'] = df.groupby(['VehicleType', 'Colour'])['Year'].transform('count')

你走的路很好。你可以这样继续:

grp_by_series=grp_by_series.reset_index()

res=df[['VehicleType', 'Colour']].merge(grp_by_series, how='left')

df['Frequency'] =  res[0]

print(df)

输出:

  VehicleType  Colour  Year  Frequency
0       Truck   Green  2002          1
1         Car   Green  2014          2
2       Truck   Black  1975          1
3         Car  Yellow  1987          1
4         Car   Green  1987          2