使用 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
我从字典中创建了一个数据框,如下所示:
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