pandas: получить максимальное значение в строке и записать столбец, где он был найден? [Дубликат]

Я хотел бы представить довольно простой вариант ES5. Функция получает 2 параметра - target и source, которые должны быть типа «объект». Target будет результирующим объектом. Target сохраняет все свои исходные свойства, но их значения могут быть изменены.

function deepMerge(target, source) {
if(typeof target !== 'object' || typeof source !== 'object') return false; // target or source or both ain't objects, merging doesn't make sense
for(var prop in source) {
  if(!source.hasOwnProperty(prop)) continue; // take into consideration only object's own properties.
  if(prop in target) { // handling merging of two properties with equal names
    if(typeof target[prop] !== 'object') {
      target[prop] = source[prop];
    } else {
      if(typeof source[prop] !== 'object') {
        target[prop] = source[prop];
      } else {
        if(target[prop].concat && source[prop].concat) { // two arrays get concatenated
          target[prop] = target[prop].concat(source[prop]);
        } else { // two objects get merged recursively
          target[prop] = deepMerge(target[prop], source[prop]); 
        } 
      }  
    }
  } else { // new properties get added to target
    target[prop] = source[prop]; 
  }
}
return target;
}

случаи:

  • , если target не имеет source свойство target получает его;
  • , если target имеет свойство source и target & amp; source не являются обеими объектами (3 случая из 4), свойство target получает overriden;
  • , если target имеет свойство source, и оба они являются объектами / массивами (1 оставшийся случай), тогда рекурсия объединяет два объекта (или объединение двух массивов),

также учитывает следующее:

  1. array + obj = array
  2. obj + array = obj
  3. obj + obj = obj (рекурсивно объединенный)
  4. array + array = array (concat)

Предсказуемо, поддерживает примитивные типы, а также массивы и объекты. Кроме того, поскольку мы можем объединить 2 объекта, я думаю, что мы можем объединить более двух с помощью функции reduce .

взглянуть на пример (и поиграть с ним, если хотите ):

var a = {
   "a_prop": 1,
   "arr_prop": [4, 5, 6],
   "obj": {
     "a_prop": {
       "t_prop": 'test'
     },
     "b_prop": 2
   }
};

var b = {
   "a_prop": 5,
   "arr_prop": [7, 8, 9],
   "b_prop": 15,
   "obj": {
     "a_prop": {
       "u_prop": false
     },
     "b_prop": {
        "s_prop": null
     }
   }
};

function deepMerge(target, source) {
    if(typeof target !== 'object' || typeof source !== 'object') return false;
    for(var prop in source) {
    if(!source.hasOwnProperty(prop)) continue;
      if(prop in target) {
        if(typeof target[prop] !== 'object') {
          target[prop] = source[prop];
        } else {
          if(typeof source[prop] !== 'object') {
            target[prop] = source[prop];
          } else {
            if(target[prop].concat && source[prop].concat) {
              target[prop] = target[prop].concat(source[prop]);
            } else {
              target[prop] = deepMerge(target[prop], source[prop]); 
            } 
          }  
        }
      } else {
        target[prop] = source[prop]; 
      }
    }
  return target;
}

console.log(deepMerge(a, b));

Существует ограничение - длина стека вызовов браузера. Современные браузеры выдадут ошибку на каком-то действительно глубоком уровне рекурсии (подумайте о тысячах вложенных вызовов). Кроме того, вы можете свободно обращаться с ситуациями типа array + object и т. Д., Добавив новые условия и проверки типов.

2
задан user1934212 5 October 2016 в 12:52
поделиться

2 ответа

Если не дублировать, вы можете использовать idxmax , но он возвращает только первый столбец значения max:

print (df.idxmax(1))
row1    col2
row2    col1
row3    col1
dtype: object

def get_column_name_for_max_values_of(row):
    return df.idxmax(1).ix[row]

print (get_column_name_for_max_values_of('row2'))
col1

Но с дубликатами используйте boolean indexing :

print (df.ix['row2'] == df.ix['row2'].max())
col1     True
col2     True
col3    False
Name: row2, dtype: bool

print (df.ix[:,df.ix['row2'] == df.ix['row2'].max()])
      col1  col2
row1     1     3
row2     2     2
row3     3     1

print (df.ix[:,df.ix['row2'] == df.ix['row2'].max()].columns)
Index(['col1', 'col2'], dtype='object')

И функция:

def get_column_name_for_max_values_of(row):
    return df.ix[:,df.ix[row] == df.ix[row].max()].columns.tolist()

print (get_column_name_for_max_values_of('row2'))
['col1', 'col2']
3
ответ дан jezrael 18 August 2018 в 21:08
поделиться

вы также можете использовать apply и создать такой метод, который имеет:

def returncolname(row, colnames):
    return colnames[np.argmax(row.values)]

df['colmax'] = df.apply(lambda x: returncolname(x, df.columns), axis=1)

Out[62]: 
row1    col2
row2    col1
row3    col1
dtype: object

a вы можете использовать df.max (ось = 1) для извлечения maxes

df.max(axis=1)
Out[69]: 
row1    3
row2    2
row3    3
2
ответ дан Steven G 18 August 2018 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: