Python 基于值间隔的数据帧行平均值

Python 基于值间隔的数据帧行平均值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,其中包含数千辆汽车的列表。每个car都有一个起始年列和一个结束年列,表示car循环的年份间隔。每辆车还具有整个期间的平均燃油消耗量列,如下所示: df_cars +-----+------------+----------+--------------------------+ | Car | Start year | End year | Average fuel consumption | +-----+------------+----------+------------

我有一个数据框,其中包含数千辆汽车的列表。每个car都有一个起始年列和一个结束年列,表示car循环的年份间隔。每辆车还具有整个期间的平均燃油消耗量列,如下所示:

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”。因此,如果一辆车的开始年份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

谢谢。快多了!