【问题标题】:Python Pandas SUMPRODUCT and L Matrix caluclationPython Pandas SUMPRODUCT 和 L 矩阵计算
【发布时间】:2018-01-03 09:02:17
【问题描述】:

我必须使用 pandas 数据框格式的列,并希望 C D 列中的输出如下所示

 A   B   C             D
 1   2   1*2           1*2
 3   4   (1+3)*4       (1*2)+(3*4)
 5   6   (1+3+5)*6     (1*2)+(3*4)+(5*6)
 7   8   (1+3+5+7)*8   (1*2)+(3*4)+(5*6)+(7*8)
 9   10  ....          .....

我正在尝试用 python 方式编写 excel 公式,有人可以为此抛出代码

a) python code for top to bottom calculation
Excel Formulas for the final outcome:
C1=IFERROR($B2*SUM(A2:$A$2)-SUMPRODUCT($B2:B$2,$A2:A$2),0)
C2=IFERROR($B3*SUM(A$2:$A3)-SUMPRODUCT($B$2:B3,$A$2:A3),0)
.....
....
C14=IFERROR($B14*SUM(A$2:$A14)-SUMPRODUCT($B$2:B14,$A$2:A14),0)

b) python code for bottom to top calculation from bottom
e1==IFERROR(SUMPRODUCT($B2:B$14,$C2:C$14)-$B2*SUM($C2:C$14),0)
E2=IFERROR(SUMPRODUCT($B3:B$14,$C3:C$14)-$B3*SUM($C3:C$14),0)
e4=IFERROR(SUMPRODUCT($B4:B$14,$C4:C$14)-$B4*SUM($C4:C$14),0)
.....
.....
.....
e14=IFERROR(SUMPRODUCT($B14:B$14,$C14:C$14)-$B14*SUM($C14:C$14),0)

【问题讨论】:

  • 为什么在这里使用IFERROR(..)
  • 嗨,威廉,如果结果为负,IFERROR 用于产生零值

标签: python excel pandas numpy-einsum


【解决方案1】:

cumsummul 结合使用:

df['C'] = df['A'].cumsum().mul(df['B'])
df['D'] = df[['A', 'B']].prod(1).cumsum()

或者:

df = df.assign(C=df['A'].cumsum().mul(df['B']),
               D=df['A'].mul(df['B']).cumsum())

print (df)
   A   B    C    D
0  1   2    2    2
1  3   4   16   14
2  5   6   54   44
3  7   8  128  100
4  9  10  250  190

编辑:

对于反向值是最简单的使用iloc[::-1]

df = df.assign(C=df['A'].iloc[::-1].cumsum().mul(df['B']),
               D=df[['A', 'B']].iloc[::-1].prod(1).cumsum())

print (df)
   A   B    C    D
0  1   2   50  190
1  3   4   96  188
2  5   6  126  176
3  7   8  128  146
4  9  10   90   90

编辑1:

df = pd.DataFrame({'A':[1,3,5,7,9], 'B':[2,4,6,8,10]})
df['C']=df['A'].iloc[::-1].cumsum().mul(df['B'])
df['D']=df[['A', 'B']].iloc[::-1].prod(1).cumsum()

print (df)
   A   B    C    D
0  1   2   50  190
1  3   4   96  188
2  5   6  126  176
3  7   8  128  146
4  9  10   90   90

#create index by column A
x = df.set_index('A')
print (x)
    B    C    D
A              
1   2   50  190
3   4   96  188
5   6  126  176
7   8  128  146
9  10   90   90

#get index of minimal value by D column
print (x['D'].idxmin())
9

【讨论】:

  • 感谢您的更新,这肯定适用于从上到下计算的查询 a),使用相同的方法从下到上计算数据应该怎么做?我的意思是b)从上述问题底部到顶部计算的python代码从单元格14开始计算并存储,然后单元格14和单元格13存储单元格14,单元格13和单元格12等。逆序计算基本相同。
  • 它有效,您提供的简单示例代码有效,不知何故我无法使用您提供的 .assign 函数。我在同一个查询中有另一个查询,假设在 D 列中需要检查什么是最小值及其对 A 的查找,然后将其分配给变量如何执行此操作?示例 D 的最小值为 90,因此 A 值为 9 将此 9 分配给变量。
  • 没问题,不需要赋值,只用第一个solurion。对于查找,嵌套使用 df = df.set_index('D') 然后 x = df.loc[90, 'A'] 它将值 9 分配给变量 x。
  • Jezreal 这在结果中出现错误 AttributeError: 'list' object has no attribute 'min' 基本上我使用的 new_table 只不过是 pandas 数据帧数组 new_table = new_table.set_index('D') x = new_table。 loc[['D'].min(axis=1),['A']] 它抛出错误,基本上我想在逻辑上检查 D 列的最小值是什么,并将 A 列查找为其等效值并放入它在 x 变量中;还有其他方法吗?
  • 很高兴能帮到你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2022-01-13
  • 2017-05-30
  • 2021-07-01
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多