博客
关于我
pandas100个骚操作:再见 for 循环!速度提升315倍!
阅读量:795 次
发布时间:2023-02-26

本文共 1993 字,大约阅读时间需要 6 分钟。

优化Pandas特征添加的高效方法

在数据科学中,高效地添加新特征对于提升处理效率至关重要。以下是优化Pandas代码的几种高效方法,帮助你快速添加基于时间条件的新特征。

一、使用 iterrows 循环优化

Pandas 提供了 itertuples 方法,可以通过生成器方式高效遍历 DataFrame 行数据。这种方法避免了传统的 for 循环,减少了索引访问的复杂性。代码如下:

@timeit(repeat=3, number=100)
def apply_tariff_iterrows(df):
energy_cost_list = []
for index, row in df.iterrows():
energy_used = row['energy_kwh']
hour = row['date_time'].hour
energy_cost = apply_tariff(energy_used, hour)
energy_cost_list.append(energy_cost)
df['cost_cents'] = energy_cost_list

测试结果显示,相比传统的循环方法,iterrows 方法速度提升了近5倍,平均执行时间为 0.713 秒。

二、pandas 的 apply 方法

进一步优化,可以使用 pandas 的 apply 方法。该方法允许你沿 DataFrame 的行或列应用函数,代码简洁且效率较高。示例代码如下:

@timeit(repeat=3, number=100)
def apply_tariff_withapply(df):
df['cost_cents'] = df.apply(
lambda row: apply_tariff(row['energy_kwh'], row['date_time'].hour),
axis=1
)

测试结果表明,apply 方法的执行时间约为 iterrows 的一半,平均为 0.272 秒。

三、矢量化操作:使用 isin 选择数据

为了进一步提升效率,可以结合 isin 方法选择符合特定时间条件的行,然后执行矢量化操作。代码如下:

# 设置 date_time 为 DataFrame 索引
df.set_index('date_time', inplace=True)
@timeit(repeat=3, number=100)
def apply_tariff_isin(df):
peak_hours = df.index.hour.isin([17, 24])
shoulder_hours = df.index.hour.isin([7, 17])
off_peak_hours = df.index.hour.isin([0, 7])
# 应用不同的费率
df.loc[peak_hours, 'cost_cents'] = df.loc[peak_hours, 'energy_kwh'] * 28
df.loc[shoulder_hours, 'cost_cents'] = df.loc[shoulder_hours, 'energy_kwh'] * 20
df.loc[off_peak_hours, 'cost_cents'] = df.loc[off_peak_hours, 'energy_kwh'] * 12

测试结果显示,该方法的执行时间仅为 0.010 秒,速度提升了71倍。

四、使用 NumPy 加速

如果以上方法仍不足以满足需求,可以借助 NumPy 的 digitize 函数实现更高效的分箱操作。代码如下:

@timeit(repeat=3, number=100)
def apply_tariff_digitize(df):
prices = np.array([12, 20, 28])
bins = np.digitize(df.index.hour.values, bins=[7, 17, 24])
df['cost_cents'] = prices[bins] * df['energy_kwh'].values

该方法的执行时间仅为 0.002 秒,性能进一步提升。

总结

通过以上优化方法,你可以显著提升数据处理速度。选择合适的方法取决于你的具体需求和数据规模。无论是使用 iterrowsapplyisin 还是 digitize,这些方法都能帮助你高效地添加基于时间条件的新特征。

转载地址:http://bpvfk.baihongyu.com/

你可能感兴趣的文章
Osgi环境配置
查看>>
OSG——选取和拖拽
查看>>
OSG中找到特定节点的方法(转)
查看>>
OSG学习:C#调用非托管C++方法——C++/CLI
查看>>
OSG学习:OSG组成(三)——组成模块(续):OSG核心库中的一些类和方法
查看>>
OSG学习:OSG组成(二)——渲染状态和纹理映射
查看>>
OSG学习:WIN10系统下OSG+VS2017编译及运行
查看>>
OSG学习:人机交互——普通键盘事件:着火的飞机
查看>>
OSG学习:几何体的操作(一)——交互事件、简化几何体
查看>>
OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
查看>>
OSG学习:几何对象的绘制(一)——四边形
查看>>
OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
查看>>
OSG学习:几何对象的绘制(二)——简易房屋
查看>>
OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
查看>>
OSG学习:场景图形管理(一)——视图与相机
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>
OSG学习:场景图形管理(二)——单窗口多相机渲染
查看>>
OSG学习:场景图形管理(四)——多视图多窗口渲染
查看>>
OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
查看>>
Sql 随机更新一条数据返回更新数据的ID编号
查看>>