簡體   English   中英

Pandas:如何在 groupby() 操作后有效地 diff()?

[英]Pandas: How to efficiently diff() after a groupby() operation?

我在 Pandas 中確實有一個大型數據集(大約 800 萬行 x 25 列),我正在努力在數據子集上以高性能方式使用 diff() function。

這是我的數據集的樣子:

                   prec   type
location_id hours             
135         78     12.0      A
            79     14.0      A
            80     14.3      A
            81     15.0      A
            82     15.0      A
            83     15.0      A
            84     15.5      A
  • 我在 [location_id, hours] 上有一個多索引。 我有大約 60k 個位置和每個位置 140 小時(構成 800 萬行)。
  • 數據的 rest 是數字(浮點)或分類。 我這里只包含了 2 列,通常有 20 列左右。
  • 我願意做的是為prec列上的每個位置應用 diff() function。 原始數據集堆積了prec數字; 通過應用 diff() 我將獲得每小時適當的prec值。
  • 考慮到這些,我在 Pandas 中實現了以下算法:
# Filter the data first
df_filtered = df_data[df_data.type == "A"] # only work on locations with 'A' type
df_filtered = df_filtered.query('hours > 0 & hours <= 120') # only work on certain hours

# Apply the diff()
for location_id, data_of_location in df_filtered.groupby(level="location_id"):
    df_data.loc[data_of_location.index, "prec"] = data_of_location.prec.diff().replace(np.nan, 0.0)
del df_filtered

  • 這在功能上非常有效,但是性能和 memory 消耗是可怕的。 我的數據集大約需要 30 分鍾,這目前是不可接受的。 for 循環的存在表明這可以得到更好的處理。
  • 有沒有更好/更快的方法來實現這一點?
  • 此外,Python 腳本的整體 memory 消耗在此操作期間暴漲; 它增長了 300% 左右! df_data數據幀消耗的memory沒有變化,但整個過程memory消耗上升。

來自@Quang Hoang 和@Ben 的輸入。 T,我想出了一個非常快但仍然消耗大量 memory 的解決方案。

# Filter the data first
df_filtered = df_data[df_data.type == "A"] # only work on locations with 'A' type
df_filtered = df_filtered.query('hours > 0 & hours <= 120') # only work on certain hours

# Apply the diff()
df_diffed = df_data.groupby(level="location_id").prec.diff().replace(np.nan, 0.0)
df_data[df_diffed.index, "prec"] = df_diffed
del df_diffed
del df_filtered

我猜可以做兩件事來改善 memory 的使用:

  • df_filtered似乎是數據的副本; 那應該會增加很多 memory。
  • df_diffed也是一個副本。

在計算這兩個變量時,memory 的使用非常密集。 我不確定是否有任何in-place方式來執行此類操作。

暫無
暫無

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

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