Python中单元素计算的行求和
我想对一个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