使用另一个列表中的值平均值计算列表的有效方法
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]
我需要用另一个列表的平均值计算一个列表。更准确地说,输入列表具有以下形式:
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]