【问题标题】:quick operation on blocks of elements in a list/dataframe对列表/数据框中的元素块进行快速操作
【发布时间】:2020-09-30 22:05:02
【问题描述】:

我有一个数据框,我需要对特定列的元素进行六乘六的平均,然后将获得的列添加到数据框。


here's an example of the desired output


我正在使用 while 循环:它可以工作,但需要很长时间(列表大约有 44k 行)。

while k<df0.shape[0]:
tradRRP[k]=np.mean(df0[['RRP']][k:k+6])
tradRRP[k+1]=np.mean(df0[['RRP']][k:k+6])
tradRRP[k+2]=np.mean(df0[['RRP']][k:k+6])
tradRRP[k+3]=np.mean(df0[['RRP']][k:k+6])
tradRRP[k+4]=np.mean(df0[['RRP']][k:k+6])
tradRRP[k+5]=np.mean(df0[['RRP']][k:k+6])
k=k+6
print(np.format_float_positional(k/df0.shape[0]*100, precision=2), end =" ")
print(' % completed')

有没有更快的方法?

谢谢!

【问题讨论】:

  • df0[['RRP']][k:k+6] 是 1x6 而不是 6x6 对吧?
  • 是的,是一个单一的值:实际上是重复了六次,因为我希望每六个间隔获得相同的平均值

标签: python numpy loops mean


【解决方案1】:

我做了一个随机数据框df0 = pd.DataFrame(np.random.randint(0,10,(44000,1)), columns={'RRP'})

通过使用 pandas 系列,我设法减少了很多时间。更具体地说,如果您运行:

step = 6
meanlist = [df0[i:i+step].mean() for i in range(0,len(df0),step) for j in range(step)]

您最终会得到一个 44k 包含 Series 对象的列表,这些对象具有列的名称、数据框每一行的类型和值。然后,您可以访问此列表以获取所需的值并将它们作为列添加到原始数据框中。

比较我系统上的两种方法:

原解决方案: 54.35062098503113 秒

熊猫系列解决方案: 12.6267409324646 秒

希望对你有帮助,祝你有美好的一天。

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2012-10-06
    • 2020-11-05
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多