【问题标题】:Excel Sumproduct equivalent in PandasPandas 中的 Excel Sumproduct 等效项
【发布时间】:2019-10-17 15:00:49
【问题描述】:

我有一个简单的练习,但在 Pandas 中找不到简单的解决方案。我的数据框具有以下形式:

         A      B      C      D              A1          B1          C1            D1
0       0.0    0.0    0.0  0.090909       0.247747    0.162398    0.381459       0.208396
1       0.0    0.0    0.0  0.090909       0.250811    0.168629    0.374599       0.205961
2       0.0    0.0    0.0  0.090909       0.252173    0.168521    0.374551       0.204755

我想始终使用 AA1 + BB1 ..D*D1

计算列的和积

我找到了一个解决方案,但它有点乱,不适合列数一增加。任何pythonic方法来解决这个问题?使用 Excel 我会给你sumproduct 函数。

目前的解决方案:

df['SP'] = df[["A", 'A1']].prod(axis=1) + df[["B", 'B1']].prod(axis=1) + df[["C", 'C1']].prod(axis=1) + df[["D", 'D1']].prod(axis=1) 

应该导致:

 df[SP]
0.018945
0.018724
0.018614

【问题讨论】:

  • df.groupby(df.columns.str[0], axis=1).prod().sum(1)
  • 这看起来很棒,但是是否可以使用列名更加动态并分配范围或列表?实际上,列名非常不同。

标签: python pandas sumproduct


【解决方案1】:

类似于 Chris 的评论,但您可以忽略列名并改为传递范围:

num_base_cols=4
num_repeat = 2

col_groups = np.tile(np.arange(num_base_cols), num_repeat)

df.groupby(col_groups, axis=1).prod().sum(1)

输出:

0    0.018945
1    0.018724
2    0.018614
dtype: float64

【讨论】:

    【解决方案2】:

    您可以识别“左”和“右”上的列,然后乘以和sum(axis=1)

    请注意,我假设您的所有列都遵循 col_name/col_name<number> 约定(如果不是这种情况,您将必须手动识别列表 cols_leftcols_right 中的列名)。

    import pandas as pd
    
    df = pd.DataFrame(data={
        'A': [0,0,0],
        'B': [0,0,0],
        'C': [0,0,0],
        'D': [0.090909, 0.090909, 0.090909],
        'A1': [0.247747,0.250811, 0.252173],
        'B1': [0.162398, 0.168629, 0.168521],
        'C1': [0.381459, 0.374599, 0.374551],
        'D1': [0.208396, 0.205961, 0.204755]
    })
    
    cols_left = [c for c in df.columns if '1' not in c]
    cols_right = [c for c in df.columns if '1' in c]
    
    out = (df[cols_left] * df[cols_right].values).sum(axis=1)
    
    out:
    
    0    0.018945
    1    0.018724
    2    0.018614
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多