簡體   English   中英

使用有序列有效地從pandas數據框中選擇行

[英]Efficiently selecting rows from pandas dataframe using sorted column

我有一個大型的pandas數據幀,有多列(c1 ... c8)和~32 mil行。 數據框已按c1排序。 我想從共享特定值c1的行中獲取其他列值。

就像是

keys = big_df['c1'].unique()
red = np.zeros(len(keys))
for i, key in enumerate(keys):
    inds = (big_df['c1'] == key)
    v1 = np.array(big_df.loc[inds]['c2'])
    v2 = np.array(big_df.loc[inds]['c6'])
    red[i] = reduce_fun(v1,v2)

然而,我認為這是非常緩慢的,因為它檢查整個列的匹配標准(即使在32 mil中可能只有10行是相關的)。 由於big_df按c1排序,而鍵只是所有唯一c1的列表,有沒有快速獲取red []數組的方法(即我知道第一行的下一個鍵是最后一行之后的行)以前的密鑰,我知道密鑰的最后一行是與密鑰匹配的最后一行,因為所有后續行都保證不匹配)。

謝謝,

伊利亞

編輯:我不確定unique()方法的順序是什么產生的,但我基本上想要為鍵中的每個鍵設置一個reduce_fun()的值,我並不特別關心它們的順序(可能最簡單的順序是命令c1已經排序了)。

Edit2:我稍微重構了代碼。 基本上,是否有一種有效的方法來構建inds。 big_df ['c1'] == key占我數據總時間的75.8%,而根據line profiler創建v1,v2需要21.6%。

我選擇了一個字典來保存c1每個項目上的縮小值,而不是列表。

red = {key: reduce_func(frame['c2'].values, frame['c7'].values) 
       for key, frame in df.groupby('c1')}

列表理解中的groupby語句怎么樣? 鑒於DataFrame已經按c1排序,這應該特別有效:

編輯 :忘記groupby返回一個元組。 哎呀!

red = [reduce_fun(g['c2'].values, g['c6'].values) for i, g in big_df.groupby('c1', sort=False)]

對我來說似乎很快就會突然顯現(對於3000萬隨機行和一個簡單的reduce_fun,約為2秒)。

暫無
暫無

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

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