【发布时间】:2018-08-29 09:57:40
【问题描述】:
我正在尝试找到正确的语法来选择 Pandas DataFrame 中的行切片,以多维切片为条件。
我想执行直方图分箱,方法是在多维 numpy 数组中提供箱,并以矢量方式比较记录是否适合一个箱或另一个箱。结果应该是一个一维 numpy 数组,其中包含每个 bin 中的项目数。
我的初始模型尝试如下,供参考,尽管我在下面的答案中提供了部分实现(使用循环代替):
import numpy as np
import pandas as pd
## Generate Random Data
X = np.random.normal(0.5,0.1,100)
## Populate a Pandas DataFrame
DF = pd.DataFrame({'x':X})
## Some example, hardcoded 1D bins.
bins = np.array([
[[0.0,0.2]],
[[0.2,0.4]],
[[0.4,0.6]],
[[0.6,0.8]],
[[0.8,1.0]]
])
hist = np.zeros(shape=(4,))
hist[:] = np.sum(
DF.loc[ (DF >= bins[:,:,0]) &
(DF > bins[:,:,1])
].dropna(how='all')
)
一般来说,数据是 n 维的,bin 遵循上面的模式,有:
[[x_min, x_max], [y_min, ymax], [z_min, z_max]]
对于每个箱(因此在上面的一维示例中明显的“额外”嵌套层)。因此,切片应该适用于多列的 DataFrame,这样
DF['x'] >= x_min and DF['x'] < x_max and
DF['y'] >= y_min and DF['y'] < y_max
等等。因此需要与维度无关;切片方法似乎是实现这一目标的最自然方式,如果可以实现的话,计算效率应该更高。
如果没有,可以尝试我的答案中的列表理解方法 - 但我在多维性方面遇到了麻烦。
【问题讨论】:
-
您的代码没有运行,可能是因为
bins[:][0]和bins[:][1]仍然是数组。但是,请确保运行代码或仅在直接解释您的问题所在的情况下添加有错误的代码。 -
谢谢;我知道代码没有运行——这就是问题所在!我看不到如何编写该行(以
hist[:] =开头),以便正确填充 hist 对象。我将不胜感激有关如何正确编写此切片的建议,或者如果不可能,请解释为什么或如何以不同的方式编写。
标签: python pandas histogram vectorization slice