Python中单元素计算的行求和

1 投票
1 回答
47 浏览
提问于 2025-04-14 17:56

我想对一个pandas数据框的每一行进行计算,同时还要用到一个列表中的元素,最后再把这些计算的结果加起来。

这里是图片描述

这个列表里的元素数量和数据框的列数是一样的。我想要计算每一行的和,比如说:

我的解决方案只得到了4个值,因为我只循环了列的数量。但我也可以循环列表的元素数量,这样结果不会变。

result = []
for i in range(len(df_n.columns)):   # these are 4
        total = sum(2/3 * x[i]**2 * df_n.iloc[i])
        result.append(total)
print(result)

使用 mass = (math.pi/6 * binning[i]**3 * roh_solid * counts_nc.iloc[i]).sum() 也能得到相同的结果。

接下来的尝试是再循环一次数据框的长度。一个循环里面再套一个循环,感觉在Python编程中不是个好主意。我需要用两个循环变量来解决这个问题吗?

有没有更优化的Python方法来解决这个问题?或者你能给我一个类似问题的提示,我在搜索时没有找到相关的解决方案?

一个列表的例子:

list = [0.4012, 0.551, 0.8124, 1.1402] 

一个数据框的例子:

                        n_1          n_2            n_3            n_4  \
time                                                                          
2022-03-18 07:16:54  1.000000e-15  1.000000e-15  1.000000e-15  1.000000e-15   
2022-03-18 07:16:55  7.887821e-01  4.929888e-02  1.000000e-15  1.000000e-15   
2022-03-18 07:16:56  2.030013e+00  1.268758e-01  1.000000e-15  1.000000e-15   
2022-03-18 07:16:57  2.944119e+00  3.236459e-01  1.000000e-15  4.654615e-02   
2022-03-18 07:16:58  3.318537e+00  4.064088e-01  1.000000e-15  6.206153e-02

(这里的时间列是索引列。)

1 个回答

1

看起来你可以把你的操作变成向量化的形式:

lst = [0.4012, 0.551, 0.8124, 1.1402] 

out = df.mul(2/3*np.array(lst)**2).sum(axis=1)

输出结果:

time
2022-03-18 07:16:54    1.616408e-15
2022-03-18 07:16:55    9.462046e-02
2022-03-18 07:16:56    2.435156e-01
2022-03-18 07:16:57    4.217743e-01
2022-03-18 07:16:58    4.921507e-01
dtype: float64

关于你的代码

我觉得你的代码里有两个主要错误:

  • 你切片列的方式不对(df_n.iloc[i]给你的是第i行,而不是列)。你应该用 df_n.iloc[:, i]
  • sum(2/3 * x[i]**2 * df_n.iloc[:, i])会计算每一列的总和,这就是你得到4个值的原因。但是你定义的Total是对i(列)进行求和的。你应该得到5个值作为输出。

因此,修正你代码的第一部分会得到:

result = []
for i in range(len(df_n.columns)):   # these are 4
        total = sum(2/3 * x[i]**2 * df_n.iloc[:, i])
        result.append(total)

print(result)
# [0.9745089642303895, 0.18342143066492023, 2.1999792e-15, 0.09413071358292742]

这相当于:

df_n.mul(2/3*np.array(x)**2).sum()

n_1    9.745090e-01
n_2    1.834214e-01
n_3    2.199979e-15
n_4    9.413071e-02
dtype: float64

但我相信你真正需要的是:

result = []
for i in range(len(df_n.columns)):   # these are 4
        total = (2/3 * x[i]**2 * df_n.iloc[:, i])
        result.append(total)

# sum per row
result = list(map(sum, zip(*result)))

print(result)
[1.6164081600000003e-15, 0.09462046128607064, 0.24351562363634796, 0.42177430406900446, 0.4921507194868146]

如上所示,这可以向量化为:

df_n.mul(2/3*np.array(x)**2).sum(axis=1)

time
2022-03-18 07:16:54    1.616408e-15
2022-03-18 07:16:55    9.462046e-02
2022-03-18 07:16:56    2.435156e-01
2022-03-18 07:16:57    4.217743e-01
2022-03-18 07:16:58    4.921507e-01
dtype: float64

撰写回答