使用另一个列表中的值平均值计算列表的有效方法

efficient way of computing a list with mean of values in another list

我需要用另一个列表的平均值计算一个列表。更准确地说,输入列表具有以下形式:

input_list =

['1.538075/42.507325',
 '1.537967/42.507690',
 '1.538292/42.507742',
 '1.538399/42.507376',
 '1.538075/42.507325']

我需要计算一个列表,其中包含斜线(“/”)前后的值的平均值,如下所示:

desired_output =

[1.5381616, 42.5074916]

我可以使用此代码正确获取 desired_output:

desired_output = pd.Series(input_list)\
                .apply(lambda r: pd.Series(r.split('/')))\
                .astype(float)\
                .mean()\
                .tolist()

但是,我有大量的输入列表,建议的代码有点慢,所以我需要找到一种更有效的方法。

有什么建议吗?

.apply 是缓慢的部分,但幸运的是 Pandas 有 .str 访问器来向量化字符串操作。这应该快得多:

desired_output = (pd.Series(input_list)
                  .str.split('/', expand=True)
                  .astype(float)
                  .mean()
                  .tolist())

这里你真的不需要pandas,一个简单的列表推导就可以了:

input_list = ['1.538075/42.507325',
 '1.537967/42.507690',
 '1.538292/42.507742',
 '1.538399/42.507376',
 '1.538075/42.507325']

from statistics import mean

out = [mean(map(float, x)) for x in zip(*(x.split('/') for x in input_list))]

输出:[1.5381616, 42.5074916]

或者使用 numpy:

np.vstack([np.fromstring(s, sep='/') for s in input_list]).mean(0).tolist()

dtype=float 创建一个 numpy 数组,然后沿 axis=0

计算平均值
np.array([s.split('/') for s in input_list], dtype=float).mean(0)

array([ 1.5381616, 42.5074916])

另一种方式,使用 pandas 和理解 -

pd.DataFrame([_.split('/') for _ in input_list]).astype(float).mean().to_list()
# [1.5381616, 42.5074916]