[英]Create 2D array from Pandas dataframe
Probably a very simple question, but I couldn't come up with a solution. 可能是一个非常简单的问题,但我无法提出解决方案。 I have a data frame with 9 columns and ~100000 rows.
我有一个包含9列和~100000行的数据框。 The data was extracted from an image, such that two columns ('row' and 'col') are referring to the pixel position of the data.
从图像中提取数据,使得两列('row'和'col')指的是数据的像素位置。 How can I create a numpy array A such that the row and column points to another data entry in another column, eg 'grumpiness'?
如何创建一个numpy数组A,使得行和列指向另一列中的另一个数据条目,例如'grumpiness'?
A[row, col]
# 0.1232
I want to avoid a for loop or something similar. 我想避免使用for循环或类似的东西。
You could do something like this - 你可以这样做 -
# 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']
Sample run - 样品运行 -
>>> 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]])
One very quick and straightforward way to do this is to use a pivot_table
: 一个非常快速和直接的方法是使用
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
Note that if any full rows/cols are missing, it will leave them out, and if any row/col pair is repeated, it will average the results. 请注意,如果缺少任何完整的行/列,则会将它们排除,如果重复任何行/列对,则会对结果取平均值。 That said, this will generally be much faster for larger datasets than an indexing-based approach.
也就是说,对于较大的数据集而言,这通常比基于索引的方法快得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.