创建新DataFrame的性能

2024-01-09

我很惊讶timings创建 DataFrames 的这个问题 https://stackoverflow.com/q/41861846/2901002:

#[30000 rows x 2 columns]
df = pd.concat([pd.DataFrame({'fruits': ['apples', 'grapes', 'figs'], 
                              'numFruits': [10, 20, 15]})]*10000)
       .reset_index(drop=True)    
#print (df)


In [55]: %timeit (pd.DataFrame([df.numFruits.values], ['Market 1 Order'], df.fruits.values))
1 loop, best of 3: 2.4 s per loop

In [56]: %timeit (pd.DataFrame(df.numFruits.values.reshape(1,-1), index=['Market 1 Order'], columns=df.fruits.values))
The slowest run took 5.64 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 424 µs per loop

什么是理性?

为什么会有如此巨大的差异numpy.ndarray.reshape https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.reshape.html vs [] ?


经过一番痛苦的调试后,我可以确认慢速程序所采取的顺序,在数据帧构造函数 https://github.com/pandas-dev/pandas/blob/master/pandas/core/frame.py#L299 :

 elif isinstance(data, (list, types.GeneratorType)):
            if isinstance(data, types.GeneratorType):
                data = list(data)
            if len(data) > 0:
                if is_list_like(data[0]) and getattr(data[0], 'ndim', 1) == 1:
                    if is_named_tuple(data[0]) and columns is None:
                        columns = data[0]._fields
                    arrays, columns = _to_arrays(data, columns, dtype=dtype)

这里它测试传递数据的类型,因为它类似于列表,然后尝试测试每个元素的类型,它不期望包含 np 数组的列表,所以它来到这里:

def _to_arrays(data, columns, coerce_float=False, dtype=None):
    """
    Return list of arrays, columns
    """
    if isinstance(data, DataFrame):
        if columns is not None:
            arrays = [data._ixs(i, axis=1).values
                      for i, col in enumerate(data.columns) if col in columns]
        else:
            columns = data.columns
            arrays = [data._ixs(i, axis=1).values for i in range(len(columns))]

        return arrays, columns

    if not len(data):
        if isinstance(data, np.ndarray):
            columns = data.dtype.names
            if columns is not None:
                return [[]] * len(columns), columns
        return [], []  # columns if columns is not None else []
    if isinstance(data[0], (list, tuple)):
        return _list_to_arrays(data, columns, coerce_float=coerce_float,
                               dtype=dtype)

然后在这里:

def _list_to_arrays(data, columns, coerce_float=False, dtype=None):
    if len(data) > 0 and isinstance(data[0], tuple):
        content = list(lib.to_object_array_tuples(data).T)
    else:
        # list of lists
        content = list(lib.to_object_array(data).T)
    return _convert_object_array(content, columns, dtype=dtype,
                                 coerce_float=coerce_float)

最后在这里:

def _convert_object_array(content, columns, coerce_float=False, dtype=None):
    if columns is None:
        columns = _default_index(len(content))
    else:
        if len(columns) != len(content):  # pragma: no cover
            # caller's responsibility to check for this...
            raise AssertionError('%d columns passed, passed data had %s '
                                 'columns' % (len(columns), len(content)))

    # provide soft conversion of object dtypes
    def convert(arr):
        if dtype != object and dtype != np.object:
            arr = lib.maybe_convert_objects(arr, try_float=coerce_float)
            arr = _possibly_cast_to_datetime(arr, dtype)
        return arr

    arrays = [convert(arr) for arr in content]

    return arrays, columns

您可以看到它执行的构造没有优化,它本质上只是迭代每个元素,转换它(这将复制它)并返回一个数组列表。

对于另一条路径,由于 np 数组形状和 dtypes 对 pandas 更友好,它可以查看数据或根据需要进行复制,但它已经知道足够的信息来优化构造

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

创建新DataFrame的性能 的相关文章

随机推荐

  • RPM 的名称-版本-发布的规则是什么?

    想象一个名为abc 123 1 x86 rpm 我发现其中有一个错误 但我不知道如何命名new包裹 Maybe abc 123 2 x86 rpm 但是如果有一个怎么办xyz rpm依赖于取决于abc 123 1 Maybe abc 123
  • ffmpeg转码为直播流

    我需要在 html 视频标签中显示 ip 摄像机流 我已经弄清楚如何从 rtsp 流转码到文件 如下所示 ffmpeg i rtsp user password ip s 640x480 tmp output mp4 现在我需要能够在这样的
  • 基于令牌的数据库身份验证失败,并显示“用户‘NT AUTHORITY\ANONYMOUS LOGON’登录失败”。

    我在基于令牌的数据库身份验证工作时遇到问题 使用 Active Directory 密码连接可以正常工作 但是当使用令牌连接时 我收到以下错误 用户 NT AUTHORITY ANONYMOUS LOGON 登录失败 这个问题已经讨论过了在
  • Admob 中介 - 发布商 ID 与中介 ID

    我想知道 Admob 中介的正确范例是什么 到目前为止 我已经有了一个普通的 AdView 横幅 这就是我认为它应该如何工作的 onFailedToReceiveAd 捕获此事件 这意味着 admob 无法提供广告 使用中介 ID 创建新的
  • 使用 MinGW 的 Eclipse CDT 不在控制台中输出

    我有一台 Windows 7 64 位 PC 并且正在尝试安装免费的 C IDE 因此我选择使用 CDT 安装 Eclipse Helios 对于 g make 和 gdb 我根据本教程安装了 msys 和 mingw http wiki
  • CoffeeScript 在更改和加载时动态选择表单字段

    我有一个 Rails 应用程序 我试图根据表单中选择的区域来选择设施列表 到目前为止 我已经实现了 group collection select 以及一些 CoffeeScript 来执行此操作 它在创建新记录和选择区域时起作用 行为是仅
  • py2neo 中的批处理

    我已经开始使用 Node4j 并且正在探索一些批处理 但不幸的是 我在创建节点之间的关系时遇到了一些问题 我的问题如下 我有一个从文件中读取的网站和用户列表 我可能在该文件中有重复的网站和用户 所以我不想为这些重复的条目插入新节点 但由于文
  • 如何将一些文本信息封装在图像中并使用 MATLAB 提取它?

    new img convert img text img text convert back new img 有人可以用 MATLAB 的内置图像来说明吗 我相信你正在寻找隐写术 http en wikipedia org wiki Ste
  • 更改 Yii2 视图中的布局文件

    我正在使用 Yii2 做一个小项目 假设我在视图中有相同的布局 页眉 页脚 例如site 除了login php在此看来 我想在这个文件中使用不同的页眉 页脚或没有页眉 页脚 我可以做什么来仅从此视图文件中删除页眉 页脚 我所能做的就是在不
  • htmlagilitypack 和动态内容问题

    我想创建一个网络 scraper 应用程序 并且我想使用网络浏览器控件 htmlagilitypack 和 xpath 来完成它 现在我设法创建 xpath 生成器 我使用网络浏览器用于此目的 它工作正常 但有时我无法动态获取 通过 jav
  • 当包含 Ice 服务器时,WebRTC 陷入连接状态(远程候选者甚至通过 LAN 也会导致问题)

    我暂时创建了一个RTCPeerConnection没有任何iceServers在尝试解决一个问题时上一期 https stackoverflow com questions 62020695 webrtc stuck in connecti
  • 如何正确访问当前AppDomain的PrivateBinPath属性?

    由于 AppDomain AppendPrivatePath 已过时 我试图弄清楚如何为项目中的当前 AppDomain 指定 PrivateBinPath 而不需要启动一个全新的 AppDomain 并且稍后能够访问它 我知道我可以在 A
  • 如何完全禁用 Django 管理员的身份验证

    我有一个 Django 服务器 使用 PostGis 我想禁用与身份验证相关的所有内容 进入管理员时无需进行身份验证 在管理中隐藏用户 组 在网上搜索后我尝试了以下组合this https stackoverflow com a 40008
  • 如何使用button props动态禁用antd modal的按钮

    我有一个 antd Modal 我正在尝试验证一个字段并为其提供验证 如何根据验证启用 禁用 确定 按钮 如果验证成功 则应启用按钮 否则应禁用按钮
  • 随处使用 Visual Studio 命令提示符工具

    如何使用 VS 命令提示符中包含的工具 Programs MS Visual Studio 2008 Visual Studio Tools Visual Studio 2008 Command Prompt 从任何命令提示符 即不调用vc
  • 自动将产品分配到 WooCommerce 中定义的产品类别

    在 Woocommerce 中 如果产品具有特定的自定义字段值 使用高级自定义字段插件生成此字段 我会尝试自动将给定的产品类别分配给产品 In my functions php我有 function auto add category pr
  • 使用 Visual C++ 将二维数组 int[n][m] 写入 HDF5 文件

    我刚刚开始使用 HDF5 希望得到有关以下内容的一些建议 我有一个二维数组 data 传递到一个方法中 该方法如下所示 void WriteData int data 48 100 int sizes 48 数据的大小实际上不是 48 x
  • CMake 和 XCode:“找不到‘NSObject’的接口声明”

    我正在尝试使用 CMake 生成 XCode 项目 但遇到了一些问题 CMake 生成的项目很好 但后来很明显它没有链接到 Foundation 和 UIKit 框架 我对 CMake 还很陌生 一直在努力克服这个问题 但没有成功 CMak
  • 匹配 IRC 昵称的正则表达式

    如何使用正则表达式来匹配 IRC 昵称 如果这会产生影响的话 这是在 Ruby 中完成的 可能会 使用正则表达式的语法 但谁知道呢 编辑 IRC 昵称可以包含任何字母 数字或以下任何字符 lt If you are testing a si
  • 创建新DataFrame的性能

    我很惊讶timings创建 DataFrames 的这个问题 https stackoverflow com q 41861846 2901002 30000 rows x 2 columns df pd concat pd DataFra