Python 高效地从从到范围内的数组拟合中查找值以计算平均值

Python 高效地从从到范围内的数组拟合中查找值以计算平均值,python,pandas,dataframe,numpy,Python,Pandas,Dataframe,Numpy,以下问题: 我们有以下结构的数据帧: ... from to weight ... 0 50 0 50 100 0 100 250 0 250 5000 0 我们有参考权重(数字)的参考列表: [20,40,80,90,110,130,220,…] 任务是:对于dataframe中的每一行,尝试从参考列表中找出适合从到范围(不包括到)的权重,计算平均值并用平均值更新权重列 示例结果将是包含平均权重值的数据帧,例如,如果权重和范围高于:

以下问题: 我们有以下结构的数据帧:

... from to   weight ...
    0    50   0
    50   100  0
    100  250  0
    250  5000 0
我们有参考权重(数字)的参考列表:

[20,40,80,90,110,130,220,…]

任务是:对于dataframe中的每一行,尝试从参考列表中找出适合从到范围(不包括到)的权重,计算平均值并用平均值更新权重列

示例结果将是包含平均权重值的数据帧,例如,如果权重和范围高于:

... from to   weight ...
    0    50   30 (mean of 20 and 40)
    50   100  85 (mean of 80 and 90)
    100  250  150 (mean of 110, 130 and 220)
    ...  ...  ...
Taks非常简单,但我们的方法缺乏性能。更新~200k行上的权重大约需要200s。主要问题是逐行找到所有相关权重,这些权重都在合适的范围内

摘自我们的方法:

    def __set_mean_weight(self):

        self.input_data['Weight'] = \
            np.where((self.input_data['Weight'] == 0),
                     np.apply_along_axis(self.__calculate_mean, axis=1, arr=self.input_data),
                     self.input_data['Weight'])

    def __calculate_mean(self, x):

        relevant_weights = \
            ref_weights[(ref_weights['Weight'] >= x[self.colIdx_from_kg])
                              & (ref_weights['Weight'] < x[self.colIdx_to_kg])]


        return 0 if relevant_weights.empty else round(relevant_weights['Weight'].mean(), 2)
def设置平均重量(自身):
自输入_数据['Weight']=\
np.式中((自输入_数据['Weight']==0),
np.沿轴应用(自计算平均值,轴=1,arr=自输入数据),
self.input_数据['Weight'])
定义计算平均值(自身,x):
相关权重=\
参考重量[(参考重量['Weight']>=x[自身重量])
&(参考重量['Weight']
更新

找到了新的方法,运行时间约为35秒。所以速度要快6到7倍,但我想这可能会更快。任何想法都非常感谢

代码如下:

    def __set_mean_weight(self):

        self.input_data['weight'] = np.where(
            self.input_data['weight'] == 0,
            self.input_data.apply(
                lambda x: np.mean(
                    self.__boolean_index(self.weight_data[x['customer']], x['from'], x['to'])
                ), axis=1
            ),
            self.input_data['weight']
        )

    def __boolean_index(self, array, left, right):
        index = (array[:] >= left) & (array[:] < right)

        return array[index]
def设置平均重量(自身):
self.input_数据['weight']=np.where(
自输入_数据['weight']==0,
self.input_data.apply(
λx:np.平均值(
self.uu布尔索引(self.weight_数据[x['customer']],x['from'],x['to']))
),轴=1
),
自输入_数据['weight']
)
定义布尔索引(自、数组、左、右):
索引=(数组[:]>=左)和(数组[:]<右)
返回数组[索引]
检查此链接

因此,您不应该使用沿轴应用函数,而是创建一个用于计算权重>0的所有客户的平均值的函数,并将该值应用于权重=0的所有客户。
现在的做法是为每个权重为0的客户调用一次函数,但这取决于计算平均值时应采用的权重范围。只有一个客户的价值符合从到的范围,才应该考虑。我的观点是,你计算了很多次平均值,每个客户的一个权重=0,这就是影响性能的原因。尝试重写代码,使其只需执行一次并存储,然后将该值写入权重为0的所有客户。当然,您应该只使用>0的权重,但这是另一个问题,因为在一个客户中,有许多不同的从到范围,所以我们无法为一个客户精确计算一个平均值。因此,最终可能/将发生的情况是,每行的平均重量不同