簡體   English   中英

如何在不加載完整文件的情況下刪除熊貓 dataframe 的一部分?

[英]How to remove part of a panda dataframe without loading the full file?

我有一個非常大的 dataframe 有數百萬行,將整個文件加載到 memory 中通常是不可行的。 最近有一些不良數據進入,我需要將它們從數據庫中刪除。 到目前為止,我所做的是:

    file = '/path to database'
    rf = pd.read_csv(f'{file}.csv', chunksize = 3000000, index_col=False)
    res = pd.concat([chunk[chunk['timestamp'] < 1.6636434764745E+018] for chunk in rf)]
    res.to_csv(f'{file}.csv', index=False) 

基本上它是打開數據庫並保存我想要的部分,覆蓋原始文件。

然而,數據變得如此之大,以至於無法適應 memory。 有沒有更好的方法基於簡單的查詢截斷 dataframe 的一部分?

與 rest 相比,截斷部分通常非常小,比如 100k 行並且總是在末尾。

在這種情況下,我會避免使用 pandas 並直接編輯 csv 文件本身。 例如:

import csv

with open("test_big.csv", "r") as f_in, open("test_out.csv", "w") as f_out:
  reader = csv.reader(f_in)
  writer = csv.writer(f_out)
  for row in reader:
    if int(row[-1]) > 9900: # your condition here
      writer.writerow(row)

對於上下文, test_big.csv看起來像這樣

1,2,3,4,5891
1,2,3,4,7286
1,2,3,4,7917
1,2,3,4,937
...

並且有 400,000 條記錄。 執行耗時 0.2 秒。

編輯:跑了 40,000,000 條記錄,耗時 15 秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM