按行组合 pandas 数据帧的有效方法

2024-03-21

我有 14 个数据框,每个数据框有 14 列和超过 250,000 行。 数据框具有相同的列标题,我想按行合并数据框。我尝试将数据帧连接到“不断增长的”数据帧,这需要几个小时。

本质上,我做了如下 13 次这样的事情:

DF = pd.DataFrame()
for i in range(13):   
    DF = pd.concat([DF, subDF])

堆栈溢出的答案here https://stackoverflow.com/a/29808739/3594865建议将所有子数据帧附加到列表中,然后连接子数据帧列表。

这听起来像是在做这样的事情:

DF = pd.DataFrame()
lst = [subDF, subDF, subDF....subDF] #up to 13 times
for subDF in lst:
    DF = pd.concat([DF, subDF])

它们不是同一个东西吗?也许我误解了建议的工作流程。这是我测试过的。

import numpy
import pandas as pd
import timeit

def test1():
    "make all subDF and then concatenate them"
    numpy.random.seed(1)
    subDF = pd.DataFrame(numpy.random.rand(1))
    lst = [subDF, subDF, subDF]
    DF = pd.DataFrame()
    for subDF in lst:
        DF = pd.concat([DF, subDF], axis=0,ignore_index=True)

def test2():
    "add each subDF to the collecitng DF as you're making the subDF"
    numpy.random.seed(1)
    DF = pd.DataFrame()
    for i in range(3):
        subDF = pd.DataFrame(numpy.random.rand(1))
        DF = pd.concat([DF, subDF], axis=0,ignore_index=True)

print('test1() takes {0} sec'.format(timeit.timeit(test1, number=1000)))
print('test2() takes {0} sec'.format(timeit.timeit(test2, number=1000)))

>> Output

test1() takes 12.732409087137057 sec
test2() takes 15.097430311612698 sec

我很感激您关于连接多个的有效方法的建议large数据帧按行排列。谢谢!


创建包含所有数据框的列表:

dfs = []
for i in range(13):
    df = ... # However it is that you create your dataframes   
    dfs.append(df)

然后将它们一举连接起来:

merged = pd.concat(dfs) # add ignore_index=True if appropriate

这比您的代码快得多,因为它创建了 14 个数据帧(您原来的 13 个以上)merged),而您的代码创建了其中 26 个(原始 13 个加上 13 个中间合并)。

EDIT:

这是您的测试代码的变体。

import numpy
import pandas as pd
import timeit

def test_gen_time():
    """Create three large dataframes, but don't concatenate them"""
    for i in range(3):
        df = pd.DataFrame(numpy.random.rand(10**6))

def test_sequential_concat():
    """Create three large dataframes, concatenate them one by one"""
    DF = pd.DataFrame()
    for i in range(3):
        df = pd.DataFrame(numpy.random.rand(10**6))
        DF = pd.concat([DF, df], ignore_index=True)

def test_batch_concat():
    """Create three large dataframes, concatenate them at the end"""
    dfs = []
    for i in range(3):
        df = pd.DataFrame(numpy.random.rand(10**6))
        dfs.append(df)
    DF = pd.concat(dfs, ignore_index=True)

print('test_gen_time() takes {0} sec'
          .format(timeit.timeit(test_gen_time, number=200)))
print('test_sequential_concat() takes {0} sec'
          .format(timeit.timeit(test_sequential_concat, number=200)))
print('test_batch_concat() takes {0} sec'
          .format(timeit.timeit(test_batch_concat, number=200)))

Output:

test_gen_time() takes 10.095820872998956 sec
test_sequential_concat() takes 17.144756617000894 sec
test_batch_concat() takes 12.99131180600125 sec

最大的份额对应于生成数据帧。批量串联大约需要2.9秒;顺序串联需要超过 7 秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按行组合 pandas 数据帧的有效方法 的相关文章

随机推荐

  • CasperJS click() 不加载新的 html

    我正在尝试使用 CasperJS click 点击在当前屏幕上生成模式的链接 当我查询正确的选择器并使用浏览器控制台中单击它时document querySelector click 它有效 但即使当我casper evaluate 这不起
  • Internet Explorer 10 和 11 中的边框半径显示问题[重复]

    这个问题在这里已经有答案了 我有一个带有边框半径的 div 它在 IE 10 和 IE11 中显示为某种片段 原因是什么 我们该如何解决这个问题 使用IE10或IE11访问本站查看效果 http css3pie com demos bord
  • 从主 Web 应用程序自动登录到另一个 ASP.NET 应用程序

    我正在主 Web 应用程序下的文件夹中运行 YetAnotherForum 的最新版本 该子文件夹在 IIS 中配置为应用程序 导航到该文件夹 并登录效果非常好 YAF 通过会员提供商进行设置并使用表单身份验证 我现在想做的是从主网站自动将
  • 布尔值是否有现有的 I18N 翻译?

    我需要根据表达式是真还是假以各种语言显示 是 或 否 目前我正在这样做 fr yml fr yes Oui no Non 一个辅助方法 def t boolean expression expression t yes t no end e
  • 多个项目共享一个 jenkinsfile

    我有多个具有类似构建步骤的项目 并且我正在考虑在这些项目中重用 Jenkinsfile 管道 我很难找到有关如何实现此类标准 据我看来 设置的文档 这是我的要求 1 Jenkinsfile存储在repo中 在多个项目之间共享 2 每个项目都
  • Spring Security 令牌身份验证 - RESTful JSON 服务

    我希望将 Spring Security 用于 Spring MVC 应用程序 该应用程序严格来说是一个 JSON Web 服务 我做了一些研究并阅读了一些文章 但还没有真正找到完整的内容 我希望应用程序完全无状态并使用基于令牌的身份验证
  • Azure 持久编排功能触发两次

    我正在尝试实现 Azure Durable Function 工作流程 每隔 6 分钟 我就会有一个 Azure TimerTrigger 函数调用一个 Azure Orchestration Function OrchestrationT
  • 在 CodeIgniter 中发送数据和重定向

    我有一个简单的 C CRUD 函数 我想发送一条消息 错误或成功 以及来自我编写的 插入 函数的重定向 有没有办法通过重定向来附加 POST 字段 在伪代码中我有 function view all set up some initial
  • python读取大型二进制文件最有效的方法是什么

    我有一个大 21 GB 文件 我想将其读入内存 然后传递给一个子例程 该子例程对我透明地处理数据 我在 Centos 6 5 上使用 python 2 6 6 因此无法升级操作系统或 python 目前 我正在使用 f open image
  • Git 克隆中的 Ansible 和 Git 权限被拒绝(公钥)

    我有一本剧本 我试图从私人存储库 GIT 克隆到服务器 我已经设置了 ssh 转发 当我 ssh 进入服务器并尝试从同一存储库手动克隆时 它成功工作 但是 当我使用 ansible 将存储库克隆到服务器时 它失败并显示 权限被拒绝公钥 这是
  • Threejs 变换矩阵排序

    我想知道 Threejs 如何对多个矩阵进行排序 例如 var mesh new THREE Mesh geometry material mesh position set 0 20 0 T transform matrix mesh r
  • XML 模式 xs:alternative 在 JSON 模式中是否可用?

    是否可以在 JSON Schema 中使用替代方案 在 XSD 中 这可以使用xs alternative元素 例如参见 如何在 XML Schema 1 1 中使用替代方案 https stackoverflow com question
  • 交叉编译器默认包含路径设置

    首先 一些背景知识 我正在尝试在 Beagleboard xM 上编写 Android 驱动程序和应用程序 我已经下载了他们的 Android 开发套件 安装了它 并且可以使用以下指示成功构建其中的所有内容http processors w
  • 纱线全局命令在 Mac 上失败

    我正在尝试使用纱线添加 vtex 但出现以下错误 Usage Error The yarn global commands have been removed in 2 x consider using yarn dlx or a thir
  • 带有 Vue 项目路由的 Azure 静态 Web 应用程序无法正常工作

    我有一个使用 Azure Static Web App 部署的 vue 项目 项目包含路由器 历史模式 功能 它在本地运行完美 但部署到 Azure 路径链接后无法正常工作 例如 当我尝试从浏览器导航访问 mysite com about
  • 我可以在 C 或 C++ 中使用二进制文字吗?

    我需要使用二进制数 我尝试写 const char x 00010000 但这没有用 我知道我可以使用与以下值相同的十六进制数00010000 但我想知道 C 中是否有二进制数的类型 如果没有 是否有其他解决方案可以解决我的问题 如果您使用
  • 恢复域对象的最佳方法

    这是一个如此简单而常见的场景 我想知道到目前为止我是如何做到的以及为什么现在遇到问题 我有这个对象 基础设施程序集的一部分 public class Queue public class QueueItem public QueueItem
  • 使用 JavaScript 测试 url 可用性

    是否可以通过 jQuery 或纯 JavaScript 测试另一个域上的网页是否可用 我尝试使用 ajax 调用获取响应标头 但无论我测试自己的域之外的哪个网站 我都会收到错误 那么我的服务器上真的需要代理脚本吗 或者我可以跳过该请求吗 是
  • 如何为邮递员请求生成未来的日期和时间

    name IronMan phone number 555555555 number of guest 10 tables 2 reservation start at 2020 10 15T10 00 00 861873Z reserva
  • 按行组合 pandas 数据帧的有效方法

    我有 14 个数据框 每个数据框有 14 列和超过 250 000 行 数据框具有相同的列标题 我想按行合并数据框 我尝试将数据帧连接到 不断增长的 数据帧 这需要几个小时 本质上 我做了如下 13 次这样的事情 DF pd DataFra