代码之家  ›  专栏  ›  技术社区  ›  JPFrancoia

Pandas,筛选数据帧、在筛选的数据帧上计算和更新主数据帧时的性能问题

  •  0
  • JPFrancoia  · 技术社区  · 6 年前

    unique_id (以及每个产品的几个条目)。我需要过滤每个产品的数据框架,执行一些计算,并更新基本数据框架。现在我正在做这样的事情:

    for unique_id in self.df.unique_id.unique():
    
        # prod_df = self.df[(self.df["unique_id"] == unique_id)]
        prod_df = self.df.query(f"unique_id == {unique_id}")
    
        some_function(prod_df)
    

    def some_function(prod_df):
    
        ... some code ...
    
        values = some_values
    
        for idx, val in zip(prod_df.index, some_values):
            self.df.loc[idx, "foo_column"] = val
    

    然而,这段代码非常慢(我在这里讲了几个小时…)。我做了一些快速分析,似乎我的脚本的大部分运行时间都花在熊猫身上 indexing.py 脚本。没什么好惊讶的。

    编辑:

    下面是一个典型的函数,我可以用它代替 some_function :

    def comp_gradient_for_column(
        self, prod_df: pd.DataFrame
    ) -> None:
    
        """
        Compute the gradient for a given column and insert it in the dataframe
    
        Arguments:
            prod_df (pd.DataFrame): sub-dataframe to work on
    
        Returns:
            None:
        """
    
        values = prod_df[column_name].values
        gradients = np.gradient(values)
    
        for idx, val in zip(prod_df.index, gradients):
            self.df.loc[idx, "foo_column"] = val
    
    0 回复  |  直到 6 年前