我试图在Python中创建这个数据结构: 2-d array structure
我必须稍后使用列键和行键。 列键和行键是随机数。
现在我有了这段代码:
import random
cols, rows = 5, 5
Matrix = [[0 for x in range(cols)] for y in range(rows)]
set_col = 0
for row in Matrix:
row[set_col] = random.randint(1,2)
columnKeys = random.sample(range(1,5), 4)
Matrix[0] = columnKeys
for row in Matrix:
print(row)
输出:
[3, 1, 2, 4]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
这不是我想要的。现在每个单元格值都为零。但稍后它会有一些相关数据,我会将这些数据与相应的行和列键一起使用。我不知道如何正确组织这个数据结构,所以我可以使用具有相应行/列键的单元格值。
怎么做没有 Pandas 和 Numpy 所以我可以使用列和行键?
答案 0 :(得分:1)
import random
COLS, ROWS = 5, 5
Matrix = [[0 for x in range(COLS)] for y in range(ROWS)]
set_col = 0
for row in Matrix:
row[set_col] = random.randint(1,2)
columnKeys = random.sample(range(1,5), 4)
Matrix[0] = [0] + columnKeys
for row in Matrix:
print(row)
<强>输出强>
[0, 3, 1, 2, 4]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
答案 1 :(得分:1)
这取决于你想要什么。
最好的方法可能是不来使用嵌套列表,而是使用字典。由于您提到了pandas,因此pandas DataFrame对象具有to_dict
函数,可将DataFrame转换为字典,并且根据您的喜好有多种选项。
我从您的示例中看到您正在尝试使用重复索引创建数据结构。这里最好的选择可能是使用通过运行df.to_dict("split")
创建的结构。
假设您的DataFrame(df)如下所示:
3 1 2 4
2 0 0 0 0
1 0 0 0 0
2 0 0 0 0
1 0 0 0 0
运行`df.to_dict(&#34; split&#34;)将执行此操作:
d = df.to_dict("split")
{
'columns': [3, 1, 2, 4],
'data': [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
'index': [2, 1, 2, 1]
}
在这种情况下访问数据,以及@Makiflow所示的数据是棘手的。即使在Pandas中,在Dataframe上有重复的索引或列也会使操作更有趣。在这种情况下,选择df['data'][3][1]
选择data
键包含的第三个列表中的第二个元素。这实际上是选择矩阵的第4行和第2列。如果您希望能够通过列名称引用项目,则必须进行更多的工作。
你可以运行col_num = d['columns'].index(3)
,它会为你提供元素3
的索引值,但是d['index'].index(2)
总是会给你0,即使你想在索引3选择2。这是因为index()
返回与条件匹配的第一个值的索引。当然,你可以简单地通过(col,row)索引元组进行选择,但这首先会破坏列名和索引值的目的。
如果要在没有pandas的情况下生成此结构,可以运行: COLS,ROWS = 5,5 columns = [random.randint(0,COLS)for _ in range(COLS)] rows = [random.randint(1,2)for _ in range(ROWS)]
d = {"columns": columns,
"index": rows,
"data": [[0 for _ in range(COLS)] for _ in range(ROWS)]
}
恕我直言 - 更好的解决方案实际上是强制您的数据结构具有唯一的索引和列值。 to_dict()
的默认输出将输出一个非常简单的字典:
d = df.to_dict() # also the same as df.to_dict("dict")
{
1: {1: 0, 2: 0},
2: {1: 0, 2: 0},
3: {1: 0, 2: 0},
4: {1: 0, 2: 0}
}
在此配置中,字典的每个键都是列的名称。这些键中的每一个都指向另一个表示该列中信息的dicitonary - 每个键是一个索引值,后跟该值。
这可能是最直观的意义,因为如果您希望在名为 1的索引的列 3处获取值,您可以这样做:
d = df.to_dict()
d[3][1]
# 0
您可以在不使用Pandas的情况下创建此数据结构:
COLS, ROWS = 5,5
rows = [i for i in range(ROWS)]
columns = [i for in range(COLS)]
{c : {i:0 for i in rows} for c in columns}
# {
# 0: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 1: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 2: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 3: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
# 4: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
# }
它真的取决于你的约束/要求。