2015-01-15 18 views
2

我的問題需要將行添加到排序的DataFrame(使用DateTimeIndex),但目前我無法找到有效的方法來執行此操作。似乎沒有任何「保險」的概念。將行有效插入排序後的數據框

我已經嘗試追加該行並採取適當的措施,並且我也嘗試使用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 
+0

也許使用帶有索引的sqlite表來處理更新?那麼當你需要使用它時,請用熊貓閱讀這張表? – b10n 2015-01-16 02:04:14

回答

2

pandas是建立在numpy。 numpy數組是固定大小的對象。雖然有numpy追加和插入函數,但實際上它們是從舊數據和新數據構造新數組。

有2種實用的方法來遞增地限定這些陣列:

  • 初始化一個大空數組,並在填入值遞增

  • 遞增地創建Python列表(或字典),以及創建來自完整列表的數組。

附加到Python列表是一項常見且快速的任務。還有一個列表插入,但速度較慢。對於分類插入,有專門的Python結構(例如bisect)。

熊貓可能增加了處理常見創建場景的功能。但是除非它編寫了C語言中特別的東西,否則它不可能比更基本的Python結構更快。

即使您必須在增量構建的各個點上使用Pandas功能,最好從基礎Python結構中隨時創建一個新的DataFrame。