用于填充数据帧的嵌套列表理解

2024-09-29 07:27:16 发布

您现在位置:Python中文网/ 问答频道 /正文

目的:为x计算一些二元多项式,例如f(x,y)=sin(x^2+y^2)∈ [-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函数不起作用,因为它只允许定义一个变量。很高兴被纠正


Tags: 数据in目的列表forreturndefnp
3条回答

我认为更像熊猫式的方法是先计算,然后将它们放入数据帧中,而不是反过来。在列表理解中执行计算并不能很好地利用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])

您可以理解列表,然后让pandas从列表创建数据框,例如:

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

相关问题 更多 >