Python 3.x 有效地使用Numpy以行块的形式进行处理

Python 3.x 有效地使用Numpy以行块的形式进行处理,python-3.x,loops,numpy,Python 3.x,Loops,Numpy,我需要迭代一组唯一的帐户(下面的示例代码中的AccountID),并计算每个唯一AccountID的功能选择(当前仅以TargetCol为例)。实际上,我将csv文件作为数据帧(1M行)读取,然后转换为Numpy记录数组,这样我仍然可以在循环中引用头名称。我实现这一点的方法是为每个唯一的AccountID创建一个切片,为每个切片计算TargetCol,然后将切片连接回一起 我下面的代码可以正常工作,但我非常确信它可以以一种更高效的方式完成(我所说的高效是指减少处理时间) 我想你需要: impor

我需要迭代一组唯一的帐户(下面的示例代码中的AccountID),并计算每个唯一AccountID的功能选择(当前仅以TargetCol为例)。实际上,我将csv文件作为数据帧(1M行)读取,然后转换为Numpy记录数组,这样我仍然可以在循环中引用头名称。我实现这一点的方法是为每个唯一的AccountID创建一个切片,为每个切片计算TargetCol,然后将切片连接回一起

我下面的代码可以正常工作,但我非常确信它可以以一种更高效的方式完成(我所说的高效是指减少处理时间)

我想你需要:

import pandas as pd
df = pd.DataFrame({'AccountID': [1,  1,       1, 2,   1,  2,  1,      2, 2],
                   'RefDay':    [1,  2,       3, 1,   4,  2,  5,      3, 4],
                   'BCol':      [1., 2., np.nan, 1., 3., 2., 1., np.nan, 2.] ,
                   'CCol':      [3., 2.,     3., 1., 3., 4., 5.,     2., 1.] })
df = df.sort_values(by=['AccountID','RefDay']).reset_index(drop=True)

# Replace with 6 in real data
periods = 3
result = df.groupby('AccountID').apply(lambda g: g['BCol'].fillna(0).rolling(periods).sum().shift(-periods + 1) / g['CCol'])
df['TargetColumn'] = result.sortlevel(1).values
print(df)
输出:

   AccountID  BCol  CCol  RefDay  TargetColumn
0          1   1.0   3.0       1      1.000000
1          1   2.0   2.0       2      2.500000
2          1   NaN   3.0       3      1.333333
3          1   3.0   3.0       4           NaN
4          1   1.0   5.0       5           NaN
5          2   1.0   1.0       1      3.000000
6          2   2.0   4.0       2      1.000000
7          2   NaN   2.0       3           NaN
8          2   2.0   1.0       4           NaN

谢谢我认为,如果我添加一个RefDay列:df=pd.DataFrame({'AccountID':[1,1,1,2,1,2],'RefDay':[1,2,3,1,4,2,5,3,4],'BCol':[1,2.,np.nan,1,3,2,1.,np.nan,2.],'CCol':[3,2,3,1,3,4,5,2,1.]})df=df.sort_值(by=['AccountID','RefDay'])因此,TargetColumn值应为:1 | 2.5 | 1.33 | NaN | NaN | 3 | 1 | NaN|NaN@GivenX好的,我已经补充了这一点,不确定这是否正是您所需要的……否则,在问题中最好有一个输入和预期输出的完整示例。超级优雅和超级快速!谢谢!
   AccountID  BCol  CCol  RefDay  TargetColumn
0          1   1.0   3.0       1      1.000000
1          1   2.0   2.0       2      2.500000
2          1   NaN   3.0       3      1.333333
3          1   3.0   3.0       4           NaN
4          1   1.0   5.0       5           NaN
5          2   1.0   1.0       1      3.000000
6          2   2.0   4.0       2      1.000000
7          2   NaN   2.0       3           NaN
8          2   2.0   1.0       4           NaN