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
构造函数包装结果
我有一个数据框 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
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
构造函数包装结果