【问题标题】:Pandas applying condition across columns for a large dataframePandas 为大型数据框跨列应用条件
【发布时间】:2019-12-10 04:07:30
【问题描述】:

我有一个数据框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 引用来自Run_1 列的V1 df

由于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 指的是来自Run_1 列的V2 df

【问题讨论】:

  • Val500 的公式是什么?
  • 什么是 Run_1_V2

标签: pandas python-3.5


【解决方案1】:

你可以试试 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.DataFramenp.ndarray 构造函数包装结果

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 2021-09-15
    • 2019-08-06
    • 2022-01-19
    • 2015-06-16
    • 2021-09-14
    • 2017-06-06
    • 2020-06-05
    • 2020-12-08
    相关资源
    最近更新 更多