簡體   English   中英

Python Pandas:查找包含numpy數組的數據框列中每行的最大值

[英]Python Pandas: Find the maximum for each row in a dataframe column containing a numpy array

我有一個Pandas DataFrame,如下所示:

      values                                      max_val_idx
0    np.array([-0.649626, -0.662434, -0.611351])            2
1    np.array([-0.994942, -0.990448, -1.01574])             1
2    np.array([-1.012, -1.01034, -1.02732])                 0

df['values']包含固定長度為3個元素的numpy數組
df['max_val_idx]包含相應數組的最大值的索引

由於已經給出了每個數組的最大元素的索引,因此提取每個條目的最大值的最有效方法是什么?
我知道數據存儲有點傻,但我自己並沒有創建它。 而且由於我收集了大量數據(+ - 50GB,因為數百個以類似方式存儲的數據庫),我想知道什么是最有效的方法。

到目前為止,我試圖遍歷df['max_val_idx]每個元素,並將其用作df['values']找到的每個數組的索引:

max_val = []         
for idx, values in enumerate(df['values']):
     max_val.append(values[int(df['max_val_idx'].iloc[idx])])

有沒有更快的替代方案?

我會忘記'max_val_idx'列。 我不認為它節省了時間,實際上更多的是語法上的痛苦。 樣本數據:

df = pd.DataFrame({ 'x': range(3) }).applymap( lambda x: np.random.randn(3) )

                                                   x
0  [-1.17106202376, -1.61211460669, 0.0198122724315]
1    [0.806819945736, 1.49139051675, -0.21434675401]
2  [-0.427272615966, 0.0939459129359, 0.496474566...

你可以像這樣提取最大值:

df.applymap( lambda x: x.max() )

          x  
0  0.019812
1  1.491391
2  0.496475

但一般來說,如果每個細胞有一個數字,生活會更容易。 如果每個單元格都有一個長度為3的數組,則可以重新排列如下:

for i, v in enumerate(list('abc')): df[v] = df.x.map( lambda x: x[i] )
df = df[list('abc')]

          a         b         c
0 -1.171062 -1.612115  0.019812
1  0.806820  1.491391 -0.214347
2 -0.427273  0.093946  0.496475

然后做一個標准的熊貓操作:

df.apply( max, axis=1 )

          x  
0  0.019812
1  1.491391
2  0.496475

不可否認,這並不比上面容易得多,但總體而言,這種形式的數據更容易使用。

我不知道它的速度將如何比較,因為我正在構建所有行的2D矩陣,但這是一個可能的解決方案:

>>> np.choose(df['max_val_idx'], np.array(df['values'].tolist()).T)
0   -0.611351
1   -0.990448
2   -1.012000

暫無
暫無

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

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