Python:查找包含numpy数组的dataframe列中每行的最大值

Python:查找包含numpy数组的dataframe列中每行的最大值,python,pandas,numpy,Python,Pandas,Numpy,我得到了一个熊猫数据框,如下所示: 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])

我得到了一个熊猫数据框,如下所示:

      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\u val\u idx]
包含对应数组的最大值的索引

既然已经给出了每个数组的最大元素索引,那么提取每个条目的最大元素的最有效方法是什么?
我知道数据的存储有点傻,但不是我自己创建的。由于我需要处理大量数据(+-50GB,数百个以类似方式存储的pickle数据库),我想知道什么是最省时的方法

到目前为止,我尝试在
df['max\u val\u idx]
的每个元素上循环,并将其用作
df['values']
中找到的每个数组的索引:

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

有没有比这更快的替代方案?

我不知道这会有多快,因为我正在构建一个包含所有行的2D矩阵,但这里有一个可能的解决方案:

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

我只会忘记“max\u val\u 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
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
但总的来说,如果每个细胞都有一个数字,生活就容易多了。如果每个单元格都有一个长度为3的数组,则可以按如下方式重新排列:

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

          x  
0  0.019812
1  1.491391
2  0.496475
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

诚然,这并不比上面简单得多,但总的来说,以这种形式处理数据会容易得多。

使用
np.max(df,axis=1)可能会有好处
而不是跨值应用Python的内置
max
,因为numpy版本可能会更多地利用数据帧的底层结构。这是一个很好的建议,尽管我刚刚尝试过,但速度较慢——我不确定为什么。@JohnE:谢谢你的回答。在对这两种解决方案进行快速测试后,第一种方法的速度似乎快了大约20倍,并且当值数组变得更大时,扩展性更好。因为在这个时刻,除了从“value”列中提取一个数字之外,我不需要对数据做更多的处理,但是如果需要对数据做更多的工作,或者如果我必须选择idx列给出的值而不是只选择最大值,我会记住你的第二种方法。哦,这对我来说也是有趣和令人惊讶的(第一种方式更快)。无论如何,很高兴看到这一点,@scott的回答很有帮助。因为我要求的是最大值,我将不得不接受@JohnE提供的答案。但是,一般来说,我也必须根据de
df['max\u val\u idx']
-列中给出的索引来选择值。在这种情况下,您的解决方案非常方便。不幸的是,
df['max_val_idx']
中的数字的
dtype
float64
,因此我必须找到一个解决办法,将这些数字用作索引(据我所知,这与安全整数转换有关)。干杯