本文共 1993 字,大约阅读时间需要 6 分钟。
在数据科学中,高效地添加新特征对于提升处理效率至关重要。以下是优化Pandas代码的几种高效方法,帮助你快速添加基于时间条件的新特征。
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 方法。该方法允许你沿 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 方法选择符合特定时间条件的行,然后执行矢量化操作。代码如下:
# 设置 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 的 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 秒,性能进一步提升。
通过以上优化方法,你可以显著提升数据处理速度。选择合适的方法取决于你的具体需求和数据规模。无论是使用 iterrows、apply、isin 还是 digitize,这些方法都能帮助你高效地添加基于时间条件的新特征。
转载地址:http://bpvfk.baihongyu.com/