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])