嵌套列表理解以填充数据帧



目标:计算一些二元多项式,例如f(x,y(=sin(x^2+y^2(,对于x∈[-1,1]和y∈[-1,1],并在数据帧中粘贴值。

我所拥有的。。。

def sunbrero(x,y):
return np.sin(x**2 + y**2)
lower=-1
upper=1
length=1000
X = np.linspace(lower, upper, num=length)
Y = np.linspace(lower, upper, num=length)
Z = pd.DataFrame(index=X,columns=Y)
# [[sunbrero(x,y) for x in X] for y in Y]
for y in Y:
Z[y] = [sunbrero(x,y) for x in X]

我希望做的是取代。。。

for y in Y:
Z[y] = [sunbrero(x,y) for x in X]

像。。。

[[Z[y] = sunbrero(x,y) for x in X] for y in Y]

但很明显,上述方法并不奏效。

我知道这是有效的。。。

Z = [[sunbrero(x,y) for x in X] for y in Y]

但它创建的是列表列表,而不是数据帧。

注1:如果其他人认为2D向量是更合理的c.f数据帧,我也持开放态度。

注意2:我认为lambda函数不起作用,因为它只允许定义一个变量。很高兴被纠正。

我认为更像熊猫式的方法是首先计算的值,然后将它们放入数据帧中,而不是相反。在列表理解中执行计算并不能很好地利用Numpy和Pandas的内部向量优化。

相反,你可以利用Numpy的广播首先获得矩阵:

length = 5
X = np.linspace(lower, upper, num=length)
Y = np.linspace(lower, upper, num=length)
result = sunbrero(X[:, None], Y)
array([[0.90929743, 0.94898462, 0.84147098, 0.94898462, 0.90929743],
[0.94898462, 0.47942554, 0.24740396, 0.47942554, 0.94898462],
[0.84147098, 0.24740396, 0.        , 0.24740396, 0.84147098],
[0.94898462, 0.47942554, 0.24740396, 0.47942554, 0.94898462],
[0.90929743, 0.94898462, 0.84147098, 0.94898462, 0.90929743]])

并将其放入一个数据帧中,如下所示:

df = pd.DataFrame(result, index=X, columns=Y)
-1.0      -0.5       0.0       0.5       1.0
-1.0  0.909297  0.948985  0.841471  0.948985  0.909297
-0.5  0.948985  0.479426  0.247404  0.479426  0.948985
0.0  0.841471  0.247404  0.000000  0.247404  0.841471
0.5  0.948985  0.479426  0.247404  0.479426  0.948985
1.0  0.909297  0.948985  0.841471  0.948985  0.909297

您几乎做到了:

df = pd.DataFrame([[sunbrero(x,y) for x in X] for y in Y])

您可以理解列表,然后让panda从列表列表中创建一个数据帧,例如:

list_of_lists = [[1, 2, 3], [4, 5, 6]]
df = pd.DataFrame(list_of_lists)

获取

0  1  2
0  1  2  3
1  4  5  6

最新更新