Python Pandas: вернуть заголовок / имя столбца, где значения равны другим в кадре данных - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь получить местоположение (я) заголовка столбца, где значение в последнем столбце равно значению в любом из других столбцов. Это должно быть добавлено как новый столбец. Предполагая, что у меня есть фрейм данных:

       category    color          size    max_value      
a      [2, 1]     [1,1,1]      [1,1,1]      [1,1,1]    
b       [2,1]   [1,1,1,1]    [1,1,1,1]        [2,1]            
c         [1]         [3]      [1,1,1]          [3]          

В то время как на этот вопрос ответили в некоторой форме здесь: Вернуть имена столбцов для определенного значения в фрейме данных панд , у меня есть списки в отличие от чисел в моем случае и продолжает выдавать ошибку

Я ожидаю, что результаты будут:

    category         color     size       max_value       matchedcols
a      [2, 1]     [1,1,1]      [1,1,1]      [1,1,1]       color,size
b       [2,1]   [1,1,1,1]    [1,1,1,1]        [2,1]         category
c         [1]         [3]     [1,1,1]           [3]            color

Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Вы можете сделать сравнение после опускания до numpy

m = df.iloc[:, :-1].to_numpy() == df.max_value.to_numpy()[:, None]
#array([[False,  True,  True],
#       [ True, False, False],
#       [False,  True, False]])

df['matched_cols'] = [', '.join(df.columns[:-1][x]) for x in m]
#  category         color          size  max_value matched_cols
#0   [2, 1]     [1, 1, 1]     [1, 1, 1]  [1, 1, 1]  color, size
#1   [2, 1]  [1, 1, 1, 1]  [1, 1, 1, 1]     [2, 1]     category
#2      [1]           [3]     [1, 1, 1]        [3]        color
1 голос
/ 17 октября 2019

Не похоже на проблему для библиотеки pandas, но в любом случае.

df = df.applymap(tuple)
cols = df.drop('max_value', 1).columns

df['matchedcols'] = (df.drop('max_value', 1)
                       .eq(df['max_value'], axis=0)
                       .apply(lambda s: ', '.join(cols[s]), 1))

  category         color          size  max_value  matchedcols
a   (2, 1)     (1, 1, 1)     (1, 1, 1)  (1, 1, 1)  color, size
b   (2, 1)  (1, 1, 1, 1)  (1, 1, 1, 1)     (2, 1)     category
c     (1,)          (3,)     (1, 1, 1)       (3,)        color

Конечно, если вам нужны спискипросто выполните все операции в скопированном df, сохраните оригинал и просто добавьте обратно в df['matchedcols'] = (...) часть.

0 голосов
/ 17 октября 2019

Как вы сказали в последнем столбце, я использую iloc и dot здесь

df1 = df.iloc[:,:-1].eq(df.iloc[:,-1], axis=0)
df['matchedcols'] = df1.dot(df1.columns+',').str.strip(',')

Out[971]:
  category         color          size  max_value matchedcols
a  [2, 1]   [1, 1, 1]     [1, 1, 1]     [1, 1, 1]  color,size
b  [2, 1]   [1, 1, 1, 1]  [1, 1, 1, 1]  [2, 1]     category
c  [1]      [3]           [1, 1, 1]     [3]        color
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...