如何用 Python 创建一个数组,其中包含三个列表,其中两个列表是数组坐标?

4
我有三个列表(实际上是pandas数据帧中的列),一个包含感兴趣的数据,一个包含x数组坐标,一个包含y数组坐标。所有列表的长度相同,并且它们在与坐标相关联的列表中的顺序相同(因此L1:“Apple”与L2:“1”和L3:“A”重合)。我想用由两个坐标列表提供的维度制作一个数组,并使用数据列表中的数据。最好的方法是什么?
期望的输出将以numpy数组的形式呈现或类似于:
array = [[0,0,0,3,0,0,2,3][0,0,0,0,0,0,0,3]] #databased on below

在这个例子中,数组的维度为 y=2(来自于 y.unique())和 x=8(来自于x.unique())。
以下是我所说的示例输入数据:
array_x array_y Data
1 a 0
2 a 0
3 a 0
4 a 3
5 a 0
6 a 0
7 a 2
8 a 3
1 b 0
2 b 0
3 b 0
4 b 0
5 b 0
6 b 0
7 b 0
8 b 3

3
请将一个样本更新为纯文本格式。 - Corralien
2
我认为您提供了一个很好的解释,但是能否请您提供两件事情以使帮助您变得更加容易:1. 数据框架的文本样本(例如print(df.head().to_dict())),并基于此提供一个包含您期望输出的样本数据框架?谢谢 :) - user17242583
好的,我已经添加了那个信息。 - Andrew D
1
请提供数据的文本形式而不是截图,以便于复制和粘贴。例如,可以使用注释中概述的 to_dict() 方法。 - BigBen
2
你如何从数据框中得到所需的输出并不清楚。你提到了 L1:Apple,但在你发布的图片中没有出现过这个东西,然后 array_y 中有字符而不是数字,并且你有一个名为 Error_type 的列似乎在构建输出数组时起着作用,但没有解释。 - user2261062
我已经更新并澄清了。 - Andrew D
3个回答

3

您可能在寻找 pivot

out = df.pivot(values=['Data'], columns=['array_y'], index=['array_x']).to_numpy()

输出:

array([[0, 0],
       [0, 0],
       [0, 0],
       [3, 0],
       [0, 0],
       [0, 0],
       [2, 0],
       [3, 3]], dtype=int64)

2
df.pivot('array_x', 'array_y', 'Data').to_numpy() - Scott Boston

1

假设您有一个如下的数据框:

import pandas as pd
import numpy as np
myDataframe = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['x','y'])

然后,您可以选择您想要的列,并从中创建一个数组。
my_array = np.array(myDataframe[['x','y']])


>>> my_array
array([[1, 2],
       [3, 4],
       [5, 6]], dtype=int64)

1
或者更好的方式是 myDataframe[['x','y']].to_numpy().values已被弃用) - user17242583
myDataframe[['x','y']].to_numpy() 相对于使用 np.array() 构造函数有什么优势? - user2261062
很遗憾,那不是我要找的东西。两个 x 和 y 列表提供了数组中第三个列表 (column) 的位置坐标。我不想用 x 和 y 列表创建一个数组,而是想用它们创建一个具有 x 和 y 维度并填充了 z 数据的数组。 - Andrew D
@Corralien,我从来没有真正理解为什么会这样,但是看看我最近读到的这篇文章吧:https://dev59.com/tGYs5IYBdhLWcg3wDPit#54508052 - user17242583

1
你可以使用zip(注意:我正在缩写一些示例数据):
data_x = [1, 2, 3, 4, 5, 6, 7, 8] * 2
data_y = ['a'] * 8 + ['b'] * 8
data_vals = [0,0,0,3,0,0,2,3,0,0,0,0,0,0,0,3]

coll = dict()
for (x, y, val) in zip(data_x, data_y, data_vals):
   if coll.get(y) is None:
     coll[y] = []

   if x > len(coll[y]):
     coll[y].extend([0] * (x - len(coll[y])))

   coll[y][x - 1] = val

result = []
for k in sorted(coll):
    result.append(coll[k])

print coll
print result

输出:

{'a': [0, 0, 0, 3, 0, 0, 2, 3], 'b': [0, 0, 0, 0, 0, 0, 0, 3]}
[[0, 0, 0, 3, 0, 0, 2, 3], [0, 0, 0, 0, 0, 0, 0, 3]]

或者,如果您知道x的最大范围,您可以预先分配列表并避免调用extend()的开销。 - scooter me fecit
coll[y] = [] 转换为 coll[y] = [0] * max_x。删除掉所有 if x > len(coll[y]) 的语句。 - scooter me fecit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接