Pandas 为大型数据框跨列应用条件

Pandas applying condition across columns for a large dataframe

我有一个数据框 df,其中的数据如下:

  Date          Var         Avg     Run_1   Run_2   Run_3   
  2019-01-01    V1          3.16    3.41    3.84    3.17    
  2019-01-02    V2          66024   0       1       287     
  2019-01-03    V1          3.16    3.41    3.84    3.17    
  2019-01-04    V2          66024   0       1       287  

Run_1、Run_2 列一直延伸到 Run_5000。日期为索引列

我正在尝试从上面创建另一个数据框 df2,其中包含以下内容:

  Date         V1_M           K=Avg_V1*v1_M   Val1    Val2    Val3
  2019-01-01   1.00            3.16        0.25      0       0   
  2019-01-02   1.01            3.19        0.22      0       0   
  2019-01-03   1.02            3.22        0.19      0       0   
  2019-01-04   1.03            3.25        0.16      0       0   

计算Val1,Val2,Val3,...,Val500的公式为:

=MAX(Run_1_V1 - K, 0)*IF(Run_1_V2 > 0, 0, 1)

Avg_V1 引用 df

中 Avg 列的 V1 变量

Run_1_V1 引用 df

Run_1 列的 V1

我目前的方法在此之后陷入困境,因为 Run_1, Run_2, ..Run_500 有 500 列,因为我不确定如何在不编写显式 for 循环的情况下将上面的公式应用于所有 500 列:

v1 = df[df['Variable'] == 'V1']
v2 = df[df['Variable'] == 'V2']

编辑: Val500 的公式:

=MAX(Run_500_V1 - K, 0)*IF(Run_500_V2 > 0, 0, 1)

Run_1_V2 引用 df

Run_1 列的 V2

你可以试试numpy的方式。首先,提取您的 runs 矩阵:

runs = df[col for col in df.columns if col.startswith('Run_')].values

然后,使用二进制掩码将所有不需要的值清零

var_col = df.VAR.str[1:].astype(int).values
mask = np.zeros((var_col.size, var_col.max()))
mask[np.arange(len(var_col)), var_col-1] = 1

并应用遮罩和 K 因子:

values = runs * mask * new_df.K.reshape(-1, 1)

然后你可以用 pd.DataFrame

np.ndarray 构造函数包装结果