将行有效插入排序的 DataFrame

Aco*_*orn 5 python numpy pandas

我的问题需要将行增量添加到排序中DataFrame(使用 a DateTimeIndex),但我目前无法找到有效的方法来执行此操作。似乎没有任何“insort”的概念。

我尝试过附加行并就地排序,并且我还尝试使用searchsorted切片和连接来获取插入点以创建新的DataFrame. 两者都“太慢”。

Pandas 是否不适合无法立即获得所有数据而是增量获取数据的工作?

我尝试过的解决方案:

级联

def insert_data(df, data, index):
    insertion_index = df.index.searchsorted(index)
    new_df = pandas.concat([df[:insertion_index], pandas.DataFrame(data, index=[index]), df[insertion_index:]])
    return new_df, insertion_index
Run Code Online (Sandbox Code Playgroud)

度假胜地

def insert_data(df, data, index):
    new_df = df.append(pandas.DataFrame(data, index=[index]))
    new_df.sort_index(inplace=True)
    return new_df
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 3

pandas是建立在numpy. numpy 数组是固定大小的对象。虽然有 numpy 的追加和插入函数,但实际上它们从旧数据和新数据构造新数组。

有两种实用方法可以增量定义这些数组:

  • 初始化一个大的空数组,并增量填充值

  • 增量创建一个 Python 列表(或字典),并从完成的列表中创建数组。

追加到 Python 列表是一项常见且快速的任务。还有列表插入,但速度较慢。对于排序插入,有专门的 Python 结构(例如bisect)。

Pandas 可能添加了处理常见创建场景的功能。但除非它用 C 语言编写了一些特殊的代码,否则它不太可能比更基本的 Python 结构更快。

即使您必须在增量构建过程中的各个点使用 Pandas 功能,最好还是从底层 Python 结构动态创建一个新的 DataFrame。