gpt4 book ai didi

python - Pandas Dataframe 行基于值间隔的平均值

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:18 27 4
gpt4 key购买 nike

我有一个 DataFrame,其中包含数千辆汽车的列表。每辆汽车都有一个“开始年份”列和一个“结束年份”列,代表汽车流通的年份间隔。每辆车还有整个时期的平均油耗栏,如下所示:

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 且结束年份 > 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)

有没有更快的方法?谢谢。

最佳答案

这是使用collections.Counter的一种方法。

矢量化,但似乎仍提供 13 倍的性能提升。

有一个pandonic但仍然疯狂的替代方案here ,但我找不到矢量化实现。

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

关于python - Pandas Dataframe 行基于值间隔的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49577772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com