将行有效插入到已排序的DataFrame中

时间:2015-01-15 17:30:44

标签: python numpy pandas

我的问题需要将行增量添加到已排序的DataFrame(带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

诉诸

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

1 个答案:

答案 0 :(得分:2)

pandas建立在numpy之上。 numpy数组是固定大小的对象。虽然有numpy append和insert函数,但实际上它们是根据旧数据和新数据构造新数组。

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

  • 初始化一个大的空数组,并逐步填写值

  • 逐步创建Python列表(或字典),并从完成列表中创建数组。

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

Pandas可能已添加了处理常见创建方案的功能。但除非它在C中编写了一些特殊的东西,否则它不可能比更基本的Python结构更快。

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