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