从Pandas数据框创建2D数组

8

这可能是一个非常简单的问题,但我想不出解决方法。我有一个数据框,有9列和约100000行。该数据从图像中提取,其中两列(“行”和“列”)指的是数据的像素位置。如何创建一个numpy数组A,使得行和列指向另一列中的另一个数据条目,例如“脾气”?

也许是一个很简单的问题,但我无法想出一个解决方案。我有一个包含9列和约100,000行的数据框。该数据从图像中提取,其中两列(“row”和“col”)指的是数据的像素位置。如何创建一个numpy数组A,使得行和列指向另一列中的另一个数据条目,例如“grumpiness”?

A[row, col]
#  0.1232

我希望避免使用for循环或类似的东西。

2个回答

11

您可以像这样做 -

# Extract row and column information
rowIDs = df['row']
colIDs = df['col']

# Setup image array and set values into it from "grumpiness" column
A = np.zeros((rowIDs.max()+1,colIDs.max()+1))
A[rowIDs,colIDs] = df['grumpiness']

样例运行 -

>>> df
   row  col  grumpiness
0    5    0    0.846412
1    0    1    0.703981
2    3    1    0.212358
3    0    2    0.101585
4    5    1    0.424694
5    5    2    0.473286
>>> A
array([[ 0.        ,  0.70398113,  0.10158488],
       [ 0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.21235838,  0.        ],
       [ 0.        ,  0.        ,  0.        ],
       [ 0.84641194,  0.42469369,  0.47328598]])

8

一个非常快捷和简单的方法是使用 pivot_table

>>> df
   row  col  grumpiness
0    5    0    0.846412
1    0    1    0.703981
2    3    1    0.212358
3    0    2    0.101585
4    5    1    0.424694
5    5    2    0.473286

>>> df.pivot_table('grumpiness', 'row', 'col', fill_value=0)
col         0         1         2
row                              
0    0.000000  0.703981  0.101585
3    0.000000  0.212358  0.000000
5    0.846412  0.424694  0.473286

请注意,如果有任何完整的行/列缺失,它将忽略它们,如果有任何重复的行/列对,它将平均结果。尽管如此,相对于基于索引的方法,对于更大的数据集来说,这通常会更快。

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