如何使用同一列的前几行的结果进行迭代?

2024-04-30 21:05:02 发布

您现在位置:Python中文网/ 问答频道 /正文

从列a B D p的数据帧开始:

import numba
import numpy as np
import pandas as pd
import vaex

d = {'A':[0,1,2,3,4,5,6],'B':[30,35,32,35,31,39,37],'D':[12,10,13,19,12,21,13],'P':[3,3,3,3,3,3,3]}
df = pd.DataFrame(data=d)

df['C'] = 0

df

导出到hdf5:

df.to_csv("v_df", index=False)
    
df = vaex.from_csv("v_df", convert=True, chunk_size=5_000_000)

我需要用每行计算列“C”,得到如下所示的结果:

'C': [0, 1.666666667, 0.552380952, 2.333630952, 0.962202381, 6.38155722, 5.714890553]

为了得到这个结果,我需要从第(1)行开始迭代每一行,并计算如下内容:

%%time
@numba.njit
def func(B, D, C, b_0=0):
    n = len(B)
    b = np.full(n, b_0, dtype=np.float64)
    for i in range(1, n):
        b[i] = ((((B[i] - B[i - 1]) / B[i - 1])) * D[i]) + C[i-1]
    return b
df['C'] = func(df['B'].to_numpy(),df['D'].to_numpy(),df['C'].to_numpy())
df

但它不起作用

第一行和第二行的结果为ok:

'C': [0, 1.666666667, -1.114286, 1.781250, -1.371429, 5.419355, -0.666667]

我尝试过“转移”(sammywemmy的建议)。对于“vaex.from_csv”之前的示例数据帧,它可以正常工作,但当通过vaex将概念实现到大数据帧时,shift不起作用

因此,问题是:是否有一种“良好实践”的方法来使用大型数据源(我使用vaex从100万行csv导入)执行此演算(考虑到“C”中的前几行,迭代“C”列中的一行的结果)

提前谢谢


Tags: csvto数据fromimportnumpydataframepandas
1条回答
网友
1楼 · 发布于 2024-04-30 21:05:02

我不确定它是否是最佳解决方案,但至少它是有效的:您可以使用vectorize设置为Trueapply方法

以下是完整的片段:

import numba
import numpy as np
import pandas as pd
import vaex

d = {'A':[0,1,2,3,4,5,6],'B':[30,35,32,35,31,39,37],'D':[12,10,13,19,12,21,13],'P':[3,3,3,3,3,3,3]}
df = pd.DataFrame(data=d)

df['C'] = 0

df

# I removed the b_0 for simplicity
def my_func(B, D, C):
    n = len(B)
    b = np.full(n, 0, dtype=np.float64)
    for i in range(1, n):
        b[i] = ((((B[i] - B[i - 1]) / B[i - 1])) * D[i]) + C[i-1]

    return b

df_vaex = vaex.from_pandas(df)

df_vaex.apply(my_func, arguments=[df_vaex["B"], df_vaex["D"], df_vaex["C"]], vectorize=True)

它给出了预期的输出:

0          0
1    1.66667
2   -1.11429
3    1.78125
4   -1.37143
5    5.41935
6  -0.666667

基本上,apply方法允许逐行应用函数,如果将vectorize设置为True,则将传递完整的数组,而不是行值。在您的情况下,它是强制性的,因为您需要来自前几行的值来计算给定行中的C值

相关问题 更多 >