查找每行具有最大值的列索引

姆斯克桑托什

我有以下数据框:

   Name1 Scr1 Name2 Scr2 Name3 Scr3
   NY    21   CA    45   SF    37
   AZ    31   BK    46   AK    23

我正在尝试获取每一行的最大值和每一行的对应名称:

df.idxmax(axis=1)

但是我该如何获得相应的名称呢?

预期产量:

   Name Hi_Scr
   CA    45
   BK    46
耶斯列尔

使用:

  • Scrby过滤列filter,将值转换为numpy array byvalues
  • 获取具有的最大值的索引 argmax
  • 使用过滤列Name并通过索引选择
  • 获取数值的最大值
  • DataFrame由构造函数创建

a = df.filter(like='Scr').values
b = a.argmax(axis=1)
c = df.filter(like='Name').values[np.arange(len(df.index)), b]
d = a.max(axis=1)

df = pd.DataFrame({'Name':c, 'Hi_Scr':d}, columns=['Name','Hi_Scr'])
print (df)
  Name  Hi_Scr
0   CA      45
1   BK      46

Pandas解决方案非常相似-在by列中创建MultiIndex extract,然后选择byxs和查找值,请使用lookup

a = df.columns.to_series().str.extract('(\D+)(\d+)', expand=False)
df.columns = pd.MultiIndex.from_tuples(a.values.tolist())

a = df.xs('Scr', axis=1)
b = a.idxmax(axis=1)
c = df.xs('Name', axis=1).lookup(df.index, b)
d = a.max(axis=1)

df = pd.DataFrame({'Name':c, 'Hi_Scr':d}, columns=['Name','Hi_Scr'])
print (df)
  Name  Hi_Scr
0   CA      45
1   BK      46

时间

df = pd.concat([df]*10000).reset_index(drop=True)


def jez2(df):
    a = df.columns.to_series().str.extract('(\D+)(\d+)', expand=False)
    df.columns = pd.MultiIndex.from_tuples(a.values.tolist())

    a = df.xs('Scr', axis=1)
    b = a.idxmax(axis=1)
    c = df.xs('Name', axis=1).lookup(df.index, b)
    d = a.max(axis=1)

    return pd.DataFrame({'Name':c, 'Hi_Scr':d}, columns=['Name','Hi_Scr'])


def jez1(df):
    a = df.filter(like='Scr').values
    b = a.argmax(axis=1)
    c = df.filter(like='Name').values[np.arange(len(df.index)), b]
    d = a.max(axis=1)

    return  pd.DataFrame({'Name':c, 'Hi_Scr':d}, columns=['Name','Hi_Scr'])

def dark(df):
    df['id'] = df.index
    ndf = pd.wide_to_long(df, ["Name", "Scr"], i="id", j="number").reset_index(0).set_index('Name')
    return ndf.groupby('id')['Scr'].agg(['max','idxmax']).rename(columns= {'max':'Hi_Scr','idxmax':'Name'})

import time

t0 = time.time()
print (jez1(df).head())
t1 = time.time() - t0
print (t1)
print (dark(df).head())
t2 = time.time() - t1
print (t2)
print (jez2(df).head())
t3 = time.time() - t2
print (t3)

  Name  Hi_Scr
0   CA      45
1   BK      46
2   CA      45
3   BK      46
4   CA      45
#jez1 solution
0.015599966049194336
    Hi_Scr Name
id             
0       45   CA
1       46   BK
2       45   CA
3       46   BK
4       45   CA
#dark solution
1515070100.961423
  Name  Hi_Scr
0   CA      45
1   BK      46
2   CA      45
3   BK      46
4   CA      45
#jez2 solution
0.04679989814758301

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

查找每行具有最大值的列名

如何确定每行具有最大值的N列?

R:具有最大值的列和行索引

SQL-获取具有最大值的列的索引

获取pyspark中每行最大值的列索引

R:每行最大值对应的索引

在数据框中查找具有相关列名和索引的最大值

当我尝试查找每行具有最大值的列名时,为什么`idxmax`会引发错误?

如何计算每行的最大值,并返回最大值的列和具有相应列名称的另一列?

从具有多个列的.txt文件中查找最大值,最小值

返回所有行具有最大值的列索引(反向一键编码)

查找所有包含最大值的索引

查找numpy數組中列的最大值的索引但刪除以前的最大值

如何识别每行最大值的列

如何查找具有相同名称的列的最大值

如何找到具有最大值的多维数组的索引

查找具有最大值的父对象

从std :: map查找具有最大值的元素

查找组中具有最大值的行

查找组中具有最大值的记录

在python中递归查找具有最大值的元素

在键值对的 PCollection 中查找具有最大值的键

每行的最大值

在spark sql的第三列中找到具有最大值的两列组合。使用此列组合查找历史最小值和最大值

查找对应于最大值的索引

如果列值相同,则查找最新行,否则返回具有同一列最大值的行

找到每行(熊猫)具有第二最大值的列名

查找每行的最大值并将其归一化

在每行中查找最大值并报告列名