Python 在每个元素都是列表的系列之间应用逐元素操作
Python apply element-wise operation between to series where every element is a list
我必须系列,其中系列的每个元素都是一个列表:
s1 = pd.Series([[1,2,3],[4,5,6],[7,8,9]])
s2 = pd.Series([[1,2,3],[1,1,1],[7,8,8]])
我想按元素计算 sklearn.metrics.mean_squared_error
,所以我会得到:
[0, 16.666, 0.33]
最好的方法是什么?
谢谢
首先,你不能那样构造Series,它会抛出错误。你的意思可能是这样的:
s1 = pd.Series([[1,2,3],[4,5,6],[7,8,9]])
s2 = pd.Series([[1,2,3],[1,1,1],[7,8,8]])
对于这些系列,您有多种选择。您可以使用 zip 创建一个对象,其中相应的元素被分块在一起,并使用 map 将函数应用于这些块。 *
需要将块作为两个单独的参数传递:
from sklearn.metrics import mean_squared_error
list(map(lambda x: mean_squared_error(*x), zip(s1, s2)))
或者更简单,您可以使用列表迭代来遍历元素(再次使用 zip):
[mean_squared_error(x, y) for x, y in zip(s1, s2)]
使用此设置,
import pandas as pd
from sklearn.metrics import mean_squared_error
s1 = pd.Series([[1,2,3],[4,5,6],[7,8,9]])
s2 = pd.Series([[1,2,3],[1,1,1],[7,8,8]])
这里有两个选项,第一个是map
,
>>> pd.Series(map(mean_squared_error, s1, s2))
0 0.000000
1 16.666667
2 0.333333
dtype: float64
第二个 np.vectorize
:
>>> import numpy as np
>>> mean_squared_error_vec = np.vectorize(mean_squared_error)
>>> mean_squared_error_vec(s1, s2)
array([ 0. , 16.66666667, 0.33333333])
我必须系列,其中系列的每个元素都是一个列表:
s1 = pd.Series([[1,2,3],[4,5,6],[7,8,9]])
s2 = pd.Series([[1,2,3],[1,1,1],[7,8,8]])
我想按元素计算 sklearn.metrics.mean_squared_error
,所以我会得到:
[0, 16.666, 0.33]
最好的方法是什么?
谢谢
首先,你不能那样构造Series,它会抛出错误。你的意思可能是这样的:
s1 = pd.Series([[1,2,3],[4,5,6],[7,8,9]])
s2 = pd.Series([[1,2,3],[1,1,1],[7,8,8]])
对于这些系列,您有多种选择。您可以使用 zip 创建一个对象,其中相应的元素被分块在一起,并使用 map 将函数应用于这些块。 *
需要将块作为两个单独的参数传递:
from sklearn.metrics import mean_squared_error
list(map(lambda x: mean_squared_error(*x), zip(s1, s2)))
或者更简单,您可以使用列表迭代来遍历元素(再次使用 zip):
[mean_squared_error(x, y) for x, y in zip(s1, s2)]
使用此设置,
import pandas as pd
from sklearn.metrics import mean_squared_error
s1 = pd.Series([[1,2,3],[4,5,6],[7,8,9]])
s2 = pd.Series([[1,2,3],[1,1,1],[7,8,8]])
这里有两个选项,第一个是map
,
>>> pd.Series(map(mean_squared_error, s1, s2))
0 0.000000
1 16.666667
2 0.333333
dtype: float64
第二个 np.vectorize
:
>>> import numpy as np
>>> mean_squared_error_vec = np.vectorize(mean_squared_error)
>>> mean_squared_error_vec(s1, s2)
array([ 0. , 16.66666667, 0.33333333])