python - append 数据框的更有效方法

标签 python pandas dataframe append concatenation

我运行了一些测试,发现这段代码效率很低。在日期范围内循环,如果 self.query 位于 df 中,则 append 该行,非常简单。但我听到很多意见,认为这样的追加效率不高,甚至很耗资源。
我的 Parquet 有 4 列,有数百万行 - query phone_count desktop_count total,删除了 2 列,这意味着我有indexquerytotal 然后奇迹就发生了。

这段代码工作得“很好”,但现在我正在寻找有经验的用户的意见,并可能得到一些提示。

有没有办法以更有效的方式做同样的事情?也许是元组?

谢谢大家!

    for filename in os.listdir(directory):
        if filename.endswith(".parquet"):
            df = pd.read_parquet(directory).drop(["phone_count","desktop_count"], axis=1)
            df.set_index("query", inplace=True)

            if self.lowercase == "on":
                df.index = df.index.str.lower()
            else:
                pass
            if self.sensitive == "on":                            
                self.datafr = self.datafr.append(df.filter(regex=re.compile(self.query), axis=0))
            else:            
                self.datafr = self.datafr.append(df.filter(regex=re.compile(self.query, re.IGNORECASE), axis=0))            


self.datafr = self.datafr.groupby(['query']).sum().sort_values(by='total', ascending=False)

最佳答案

每个循环都会重复一些事情:

  • 正则表达式模式不需要每次都重新编译
  • 重复 DataFrame.appendpd.concat([frame1, frame2, ...])
  • list.appendDataFrame.append 快很多

试试这个:

option = re.IGNORECASE if self.lowercase == "on" else 0
pattern = re.compile(self.query, option)
subframes = []

for filename in os.listdir(directory):
    if filename.endswith(".parquet"):
        df = pd.read_parquet(directory).drop(["phone_count","desktop_count"], axis=1)
        df.set_index("query", inplace=True)

        # Not sure if this statement is necessary. The regex
        # is already IGNORECASE when lowercase == "on"
        if self.lowercase == "on":
            df.index = df.index.str.lower()

        # Multiple list.append
        subframes.append(df.filter(pattern, axis=0))

# But a single pd.concat
self.datafr = pd.concat([self.datafr] + subframes)

关于python - append 数据框的更有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60218414/

相关文章:

python - 类型错误 : unhashable type: 'slice'

dataframe - 在极坐标中使用子集选项实现 cumcount()

python - Pandas 数据框 : add & remove prefix/suffix from all cell values of entire dataframe

python - 从文件中读取空终止(C 风格)字符串的简洁方法?

python - 如何从 Beautiful Soup 网站抓取的结果中将 Django 模型添加到数据库中?

python - 使用MySQLdb执行方法

python - 将数据框从长格式转换为宽格式并动态命名列

java - 从 python 调用 Java 应用程序时无法读取文件

python - 如何根据另一列的值获取值增量

R最快速的方式条件选择