(Pandas)有没有更快的方法来找到一行中所有值的索引,这些值等于Pandas中该行的最大值?

mbzjlibv  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(103)

我有一个panda Dataframe Cellvoltage,它有多列浮点值,我试图得到每一行中所有等于最大值的值的索引。
为了达到这个目的,我使用了下面的代码:

req_indices = np.argwhere(Cellvoltage.values == np.amax(Cellvoltage.values, axis=1).reshape(-1,1))
max_voltage_idx = [0]*len(req_indices)
for x,y in req_indices:
    if max_voltage_idx[x] == 0:
        max_voltage_idx[x] = [y]
    else:
        max_voltage_idx[x].append(y)
Cellvoltage['max_voltage_idx']  = pd.Series(max_voltage_idx).apply(np.array)

有没有更好/更快的方法来实现同样的目标?

62lalag4

62lalag41#

使用df.eq(df.max(axis=1), axis=0)where屏蔽非最大值,然后使用stack删除NaN并获取索引对。

out = df.where(df.eq(df.max(axis=1), axis=0)).stack().index.tolist()

输入示例:

A  B  C  D
0  1  2  3  3
1  4  1  1  4

输出:

[(0, 'C'), (0, 'D'), (1, 'A'), (1, 'D')]

如果只想将列表中的列作为新列,请添加groupby.agg步骤:

df['max_voltage_idx']= (df                  
   .where(df.eq(df.max(axis=1), axis=0)).stack()
   .reset_index(-1).iloc[:, 0]
   .groupby(level=0).agg(list)
 )

输出:

A  B  C  D max_voltage_idx
0  1  2  3  3          [C, D]
1  4  1  1  4          [A, D]
ds97pgxw

ds97pgxw2#

另一种可能的解决方案:

indices = np.where(df.values == np.amax(df.values, axis=1)[:, None])
list(zip(indices[0], df.columns.values[indices[1]]))

输出:

[(0, 'C'), (0, 'D'), (1, 'A'), (1, 'D')]

输入:
同样的@mozway(我感谢他)使用:

A  B  C  D
0  1  2  3  3
1  4  1  1  4

相关问题