Python 基于值间隔的数据帧行平均值
我有一个数据框,其中包含数千辆汽车的列表。每个car都有一个起始年列和一个结束年列,表示car循环的年份间隔。每辆车还具有整个期间的平均燃油消耗量列,如下所示:Python 基于值间隔的数据帧行平均值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,其中包含数千辆汽车的列表。每个car都有一个起始年列和一个结束年列,表示car循环的年份间隔。每辆车还具有整个期间的平均燃油消耗量列,如下所示: df_cars +-----+------------+----------+--------------------------+ | Car | Start year | End year | Average fuel consumption | +-----+------------+----------+------------
df_cars
+-----+------------+----------+--------------------------+
| Car | Start year | End year | Average fuel consumption |
+-----+------------+----------+--------------------------+
| 1 | 2002 | 2025 | 10.0 |
+-----+------------+----------+--------------------------+
| 2 | 1995 | 2008 | 12.5 |
+-----+------------+----------+--------------------------+
| 3 | 2005 | 2017 | 8.5 |
+-----+------------+----------+--------------------------+
在2000年至2015年期间,我希望获得每年运营的车队的平均燃油消耗量“Y”。因此,如果一辆车的开始年份for y in range(2000, 2015):
df_cars[(df_cars["Start year"]<=int(y))&(df_cars["End year"]>=int(y))]["Average fuel consumption"].mean(axis=0)
范围内y的(2000年、2015年):
df_车[(df_车[“开始年份”]=int(y)][“平均油耗”]。平均值(轴=0)
有没有更快的方法?
谢谢。这里有一种使用
集合的方法。计数器
它没有矢量化,但似乎仍然提供了13倍的性能改进
有一个泛音速但仍然是循环的替代方案,但我找不到矢量化的实现
import pandas as pd
from collections import Counter
df = pd.DataFrame([[1, 2002, 2025, 10.0],
[2, 1995, 2008, 12.5],
[3, 2005, 2017, 8.5]],
columns=['Car', 'StartYear', 'EndYear', 'AvgFuelConsumption'])
def jp(df):
# first get range of years
year_range = range(df['StartYear'].min(), df['EndYear'].max()+1)
res = pd.DataFrame(index=year_range, columns=['AvgFuelConsumption'])
# use collections.Counter for sums and counts
c_sum = Counter()
c_count = Counter()
for idx, car, start, end, fuel in df.itertuples():
for i in range(start, end+1):
c_sum[i] += fuel
c_count[i] += 1
# calculate averages by year
c_res = {y: c_sum[y] / c_count[y] for y in c_sum}
# create dataframe from dictionary
res = pd.DataFrame.from_dict(c_res, orient='index')
return res
def original(df):
res = pd.DataFrame(index=range(2000, 2026), columns=['AvgFuelConsumption'])
for y in range(2000, 2026):
res.loc[y, 'AvgFuelConsumption'] = df[(df["StartYear"]<=int(y))&(df["EndYear"]>=int(y))]["AvgFuelConsumption"].mean(axis=0)
return res
%timeit jp(df) # 4.17ms
%timeit original(df) # 54.8ms
将熊猫作为pd导入
从收款进口柜台
df=pd.DataFrame([[12002025,10.0],
[2, 1995, 2008, 12.5],
[3, 2005, 2017, 8.5]],
列=['Car'、'StartYear'、'EndYear'、'AvgFuelConsumption'])
def jp(df):
#第一次获得的年数范围
年份范围=范围(df['StartYear'].min(),df['EndYear'].max()+1)
res=pd.DataFrame(index=year\u range,columns=['AvgFuelConsumption'])
#使用集合。总和和计数计数器
c_sum=计数器()
c_计数=计数器()
对于idx、car、start、end、df中的燃油。itertuples()
对于范围内的i(开始、结束+1):
c_和[i]+=燃料
c_计数[i]+=1
#按年份计算平均数
c_res={y:c_sum[y]/c_count[y]表示c_sum}
#从字典创建数据帧
res=pd.DataFrame.from_dict(c_res,orient='index')
返回res
def原件(df):
res=pd.DataFrame(index=range(20002026),columns=['AvgFuelConsumption']
对于范围内的y(2000年、2026年):
res.loc[y,'AvgFuelConsumption']=df[(df[“StartYear”]=int(y))][“AvgFuelConsumption”]。平均值(轴=0)
返回res
%timeit jp(df)#4.17ms
%原始时间(df)#54.8ms
谢谢。快多了!