【发布时间】:2019-04-24 12:14:15
【问题描述】:
我有一个包含许多列的大数据框。为简单起见,假设:
df_sample = pd.DataFrame({'a':np.arange(10)})
我需要在 df_sample 中定义一个新列(比如列'b'),它需要使用一些插值函数,其参数取自列'a'。
现在,问题是每行的插值函数都不同。对于每一行,我从不同的一维网格进行插值;所以我对每一行都有不同的插值函数。所以,我所做的是预先生成这些插值函数并将它们存储到一个数组中。举个例子,下面的代码生成一个样本数组'list_interpfns'
list_interpfns = np.array([None]*10)
for j in range(10):
list_interpfns[j] = scipy.interpolate.interp1d(np.linspace(0,10*(j+1),10),np.linspace(0,50,10))
要生成 df_sample.b[j],我需要使用带有参数 df_sample.a[j] 的 list_interpfns[j]。由于我无法为此直接应用列公式,因此我将其放入循环中。
df_sample['b'] = 0
for j in range(10):
df_sample.loc[j,'b'] = list_interpfns[j](df_sample.a[j])
问题是这个操作需要很多时间。在这个小例子中,计算可能看起来很快。但是我的实际程序要大得多,当我比较所有操作所花费的时间时,这个特定的操作顺序占用了总时间的 84%;我需要加快速度。
如果有某种方法可以避免 for 循环(例如使用 df.apply 或其他方法),那么我相信它可以减少操作时间。你能给出可能的替代方案吗?
【问题讨论】:
标签: python loops interpolation