对 "list" 列表中的元素求和,每个元素具有不同的索引
Summing elements in a list of "list", each with different index
从循环中我有一个变量 A:
aa = pd.Series(np.random.randn(5))
aaaa = []
aaaa.append(aa.loc[[1]])
aaaa.append(aa.loc[[4]])
aaaa
[1 0.07856
dtype: float64, 4 0.94552
dtype: float64]
现在我想对 A 中的元素求和(或进行任何其他计算)。我尝试使用求和函数,但不幸的是它不起作用。例如,
B = sum(aaaa)
给我
1 NaN
4 NaN
dtype: float64
我找到了以下问题和解决方案,但是,它不适用于我的问题,因为 TO 只有一个列表,而不是多个列表相互附加(具有不同的索引)
Summing elements in a list
edit4:因为我必须多次 运行,所以我对两个答案都计时了:
%timeit sum([i.values for i in aaaa])
3.78 µs ± 5.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit pd.concat(aaaa).sum()
560 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
令人惊讶的是,sum 中的 "loop" 比 pd.Series.concat().sum() 函数
快得多
edit5:添加以防其他人遇到同样的问题:如果不知道输入是 pd.Series 还是 pd.Series 的列表,可以执行以下操作:
res = sum(aa) if isinstance(aa, pd.Series) else sum([i.values for i in aa])
您误用了 pd.Series.loc
,这导致您的列表元素是 pd.Series
而不是标量。
尝试使用 pd.Series.iloc
进行整数索引:
s = pd.Series(np.random.randn(5))
A = []
A.append(s.iloc[1])
A.append(s.iloc[4])
res = sum(A)
请注意,您可以直接通过 pd.Series.sum
:
执行此计算
res = s.iloc[[1, 4]].sum()
如果你有pd.Series
的列表,你可以使用:
res = pd.concat(A).sum()
摆脱困境的方法有很多种,只有你自己知道最适合自己的方法。
当您执行 aa.loc[[1]]
时,您最终会得到一个 pd.Series,如果您执行 aa.loc[1]
,您将得到一个标量,以及 .iloc
。
因此,只需删除 aa.loc[[1]]
中的第二对方括号,您的代码就可以正常工作。
sum
需要一个带数字的迭代器才能工作。因此,如果您想保留第二对方括号,则下一行也可以使用,尽管您现在将得到一个 numpy 数组而不是浮点数作为答案。
sum([i.values for i in aaaa])
从循环中我有一个变量 A:
aa = pd.Series(np.random.randn(5))
aaaa = []
aaaa.append(aa.loc[[1]])
aaaa.append(aa.loc[[4]])
aaaa
[1 0.07856
dtype: float64, 4 0.94552
dtype: float64]
现在我想对 A 中的元素求和(或进行任何其他计算)。我尝试使用求和函数,但不幸的是它不起作用。例如,
B = sum(aaaa)
给我
1 NaN
4 NaN
dtype: float64
我找到了以下问题和解决方案,但是,它不适用于我的问题,因为 TO 只有一个列表,而不是多个列表相互附加(具有不同的索引)
Summing elements in a list
edit4:因为我必须多次 运行,所以我对两个答案都计时了:
%timeit sum([i.values for i in aaaa])
3.78 µs ± 5.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit pd.concat(aaaa).sum()
560 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
令人惊讶的是,sum 中的 "loop" 比 pd.Series.concat().sum() 函数
快得多edit5:添加以防其他人遇到同样的问题:如果不知道输入是 pd.Series 还是 pd.Series 的列表,可以执行以下操作:
res = sum(aa) if isinstance(aa, pd.Series) else sum([i.values for i in aa])
您误用了 pd.Series.loc
,这导致您的列表元素是 pd.Series
而不是标量。
尝试使用 pd.Series.iloc
进行整数索引:
s = pd.Series(np.random.randn(5))
A = []
A.append(s.iloc[1])
A.append(s.iloc[4])
res = sum(A)
请注意,您可以直接通过 pd.Series.sum
:
res = s.iloc[[1, 4]].sum()
如果你有pd.Series
的列表,你可以使用:
res = pd.concat(A).sum()
摆脱困境的方法有很多种,只有你自己知道最适合自己的方法。
当您执行 aa.loc[[1]]
时,您最终会得到一个 pd.Series,如果您执行 aa.loc[1]
,您将得到一个标量,以及 .iloc
。
因此,只需删除 aa.loc[[1]]
中的第二对方括号,您的代码就可以正常工作。
sum
需要一个带数字的迭代器才能工作。因此,如果您想保留第二对方括号,则下一行也可以使用,尽管您现在将得到一个 numpy 数组而不是浮点数作为答案。
sum([i.values for i in aaaa])