Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pandas基于多个条件获取列名_Python_Pandas - Fatal编程技术网

Python 使用Pandas基于多个条件获取列名

Python 使用Pandas基于多个条件获取列名,python,pandas,Python,Pandas,我有以下数据帧: c1 e c2 d s scr_s scr_c1 scr_d scr_c2 scr_e r1 r2 12 6 13 3 2 11 22 19 5 5 19 scr_s scr_d 13 11 2 6 13 3 9 24 15 9 13 scr_c1 scr_s 我正在尝试获取列的名称,该列计算

我有以下数据帧:

    c1  e  c2   d   s  scr_s  scr_c1  scr_d  scr_c2  scr_e  r1     r2
12  6   13  3   2   11    22      19      5       5     19  scr_s  scr_d    
13  11  2   6   13  3      9      24     15       9     13  scr_c1 scr_s    
我正在尝试获取列的名称,该列计算列scr_s、scr_c1、scr_d、scr_c2、scr_e的最大值和最小值。因此,值最高的列名将存储在r1中,值最低的列名将存储在r2中

要计算r1和r2,我使用:

data['r1'] = data[['scr_s','scr_c1','scr_d','scr_c2','scr_e']].idxmax(axis=1)
data['r2'] = data[['scr_s','scr_c1','scr_d','scr_c2','scr_e']].idxmin(axis=1)
问题:当两列具有相同的最大值或最小值时,我必须在其中一列“c1”、“e”、“c2”、“d”、“s”中选择具有最大值的列名

在这种特殊情况下,分析r2列时,结果应不同:

对于第一行,列scr_d和scr_c2共享相同的最小值,因此应计算列“d”和“c2”。在列“d”和“c2”之间,最大值属于“c2”,因此r2的预期结果为scr_c2。 我怎样才能解决这个问题

预期产出:

创建相对相关列名的列表 创建这些列的元组列表 把那些元组压缩在一起 看起来像这样

[[(19, 6), (19, 13), (5, 3), (5, 2), (22, 11)],
 [(24, 11), (13, 2), (9, 6), (15, 13), (9, 3)]]
设置一个idxmax/idxmin类型的东西
你可以这样开始:

创建要检查的元素列表 找到最大值 如果有两个元素具有相同的最大值,请进一步检查。 否则返回我们写入r1或r2的字符串
尝试:data['r1']=data['scr_s'、'scr_c1'、'scr_c2'、'scr_d'、'scr_e']].idxmaxaxaxis=1I有数百个观察值,因此更改顺序没有帮助。观察值列名是什么样子的?它们都是scr\U cxxx和scr\U d吗?你如何评价它们的重要性?我所说的观察是指样品,对不起。问题是,我必须比较列C1,E,C2,D,S,以便选择“WEENE”请@ PEPE也考虑我的方法,因为它应该是容易当超过2个元素是相等的。您只需添加一个条件。
base = ['c1', 'e', 'c2', 'd', 's']
extd = [f'scr_{c}' for c in base]
base_tups = [*zip(*map(df.get, base))]
extd_tups = [*zip(*map(df.get, extd))]
zvals = [[*zip(*t)] for t in zip(extd_tups, base_tups)]
[[(19, 6), (19, 13), (5, 3), (5, 2), (22, 11)],
 [(24, 11), (13, 2), (9, 6), (15, 13), (9, 3)]]
r = range(len(base))

rvals = {}

rvals['r1'] = [extd[max(r, key=lambda i: x[i])] for x in zvals]
# flip sign on second element to get what OP wants v
rvals['r2'] = [extd[min(r, key=lambda i: (x[i][0], -x[i][1]))] for x in zvals]

df.assign(**rvals)

    c1   e  c2   d   s  scr_s  scr_c1  scr_d  scr_c2  scr_e      r1      r2
12   6  13   3   2  11     22      19      5       5     19   scr_s  scr_c2
13  11   2   6  13   3      9      24     15       9     13  scr_c1  scr_c2
def fmax(r, ind):
    l=[]    
    for i in ind:
        l.append(r[i])        
    m = max(l)
    nl=[i for i, j in enumerate(l) if j == m]
    if(len(nl)==2):        
        e1=ind[nl[0]] 
        e2=ind[nl[1]] 
        e1=e1.replace('scr_','') # element 1
        e2=e2.replace('scr_','') # element 2
        if(r[e1]> r[e2]):
            return 'scr_'+e1
        else:
            return 'scr_'+e2
    else:
        return ind[l.index(max(l))] #returns single max




def fmin(r, ind):
    l=[]    
    for i in ind:
        l.append(r[i])        
    m = min(l)
    nl=[i for i, j in enumerate(l) if j == m]
    if(len(nl)==2):        
        e1=ind[nl[0]] 
        e2=ind[nl[1]] 
        e1=e1.replace('scr_','') # element 1
        e2=e2.replace('scr_','') # element 2
        if(r[e1]> r[e2]):
            return 'scr_'+e1
        else:
            return 'scr_'+e2
    else:
        return ind[l.index(min(l))] #retuns single min


df['r1']= df.apply(lambda r: fmax(r, ['scr_s','scr_c1','scr_d','scr_c2','scr_e']), axis=1)
df['r2']= df.apply(lambda r: fmin(r, ['scr_s','scr_c1','scr_d','scr_c2','scr_e']), axis=1)

print(df)
    c1   e  c2   d   s  scr_s  scr_c1  scr_d  scr_c2  scr_e r1 r2
12   6  13   3   2  11     22      19      5       5     19  .  .
13  11   2   6  13   3      9      24     15       9     13  .  .
    c1   e  c2   d   s  scr_s  scr_c1  scr_d  scr_c2  scr_e      r1      r2
12   6  13   3   2  11     22      19      5       5     19   scr_s  scr_c2
13  11   2   6  13   3      9      24     15       9     13  scr_c1  scr_c2