【发布时间】:2018-05-22 18:07:18
【问题描述】:
我有一个 DataFrame,其中包含 x、y、z 坐标的列以及该位置的值,我想将其转换为 3 维 ndarray。
为了让事情变得更复杂,并非所有值都存在于 DataFrame 中(这些值可以只替换为 ndarray 中的 NaN)。
只是一个简单的例子:
df = pd.DataFrame({'x': [1, 2, 1, 3, 1, 2, 3, 1, 2],
'y': [1, 1, 2, 2, 1, 1, 1, 2, 2],
'z': [1, 1, 1, 1, 2, 2, 2, 2, 2],
'value': [1, 2, 3, 4, 5, 6, 7, 8, 9]})
应该导致ndarray:
array([[[ 1., 2., nan],
[ 3., nan, 4.]],
[[ 5., 6., 7.],
[ 8., 9., nan]]])
对于二维,这很容易:
array = df.pivot_table(index="y", columns="x", values="value").as_matrix()
但是,这种方法不能应用于三个或更多维度。
你能给我一些建议吗?
如果这也适用于三个以上的维度,则可以加分,处理多个定义的值(通过取平均值)并确保所有 x、y、z 坐标是连续的(通过在缺少坐标时插入 NaN 的行/列)。
编辑:更多解释:
我从一个 CSV 文件中读取数据,该文件包含 x、y、z 坐标列,可选择频率和此时的测量值和频率。然后我将坐标四舍五入到指定的精度(例如 0.1m),并希望得到一个包含每个(四舍五入)坐标的平均测量值的 ndarray。值的索引不需要与位置一致。但是,它们的顺序必须正确。
编辑:我刚刚进行了快速性能测试:
jakevdp解耗时1.598s,Divikars解耗时7.405s,JohnE解耗时7.867s,Wens解耗时6.286s。
【问题讨论】:
-
您的二维技巧与您所说的不符。即数组不是ndarray。它仍然是一个 DataFrame。
-
@stucash 抱歉,我将其更改为返回 ndarray