首页 > 解决方案 > 将一列与多列进行比较,并返回熊猫条件首先匹配的索引

问题描述

我想将我的数据框的列(年龄)与某些列(1 到 7)进行比较并设置一个条件,例如 col 1 到 7 的任何值是 col Age 值的 75% 或更少,那么我想要返回匹配的第一列的索引。

   Weight Name   Age     1     2        3      4        5      6        7    Output
  0   45  Sam     100 -75.0  -45.0    -92.0  -79.0   -57.0   -55.0   -35.0   true
  1   88  Andrea  25   30.0  -17.0     -4.0   18.0    20.0    40.0    NaN    true
  2   56  Alex    55  -47.0  -34.0    -12.0  -10.0    10.0    NaN     NaN    true
  3   15  Robin   8    13.0   35.0     37.0   57.0    NaN     NaN     NaN    false
  4   71  Kia     21   22.0   24.0     44.0    NaN    NaN     NaN     NaN    false
  5   44  Sia     43    2.0   22.0      NaN    NaN    NaN     NaN     NaN    true
  6   54  Ryan    45   20.0    NaN      NaN    NaN    NaN     NaN     NaN    true
  7   34  Dimi    65    NaN    NaN      NaN    NaN    NaN     NaN     NaN    false

我能够生成具有真假的列,如果在一行中,任何值都比“年龄”列中的值少 75%,代码如下:

 df['Output'] = ((df[['Age']].values)* 0.75  > df.iloc[:, 3:9].values).any(axis=1) 

但是,我想获取列的名称,它将输出设为 true。如果输出为假,我想获得该行的最大值,为此我使用 .idxmax(axis=1)。

   Weight Name   Age     1     2        3      4        5      6        7   Expected Output
  0   45  Sam     100 -75.0  -45.0    -92.0  -79.0   -57.0   -55.0   -35.0   1
  1   88  Andrea  25   30.0  -17.0     -4.0   18.0    20.0    40.0    NaN    2
  2   56  Alex    55  -47.0  -34.0    -12.0  -10.0    10.0    NaN     NaN    1
  3   15  Robin   8    13.0   35.0     37.0   57.0    NaN     NaN     NaN    4
  4   71  Kia     21   22.0   24.0     44.0    NaN    NaN     NaN     NaN    3
  5   44  Sia     43    2.0   22.0      NaN    NaN    NaN     NaN     NaN    1
  6   54  Ryan    45   20.0    NaN      NaN    NaN    NaN     NaN     NaN    1
  7   34  Dimi    65    NaN    NaN      NaN    NaN    NaN     NaN     NaN    NaN

标签: pythonpandas

解决方案


尝试使用 apply() 方法遍历行:

def compare_age(row):
    age = row['age']
    columns = [str(num) for num in range(1, 8)]
    value = row[[columns]].max()
    for column in columns:
        if row[column] <= 0.75*age:
            value = float(column)
            break
    return value

df['Output'] = df.apply(compare_age, axis=1)

推荐阅读