Панды сравнивают 3 столбца и выводят результат, если количество больше 1

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть 3 столбца со значением A, B или C, я хочу сравнить эти 3 столбца и выдать вывод, значение которого имеет более 1 отсчета. Если количество равно нулю, то вывод будет «-«

Ввод:

     | col1  | col2  | col3  |
    |-------|-------|-------|
    | A     | A     | B     |
    | A     | B     | B     |
    | C     | B     | C     |
    | A     | B     | C     |
  

Вывод:

     | col1  | col2  | col3  | Result|
    |-------|-------|-------|-------|
    | A     | A     | B     | A     |
    | A     | B     | B     | B     |
    | C     | B     | C     | C     |
    | A     | B     | C     | -     |
  

Ответ №1:

Давайте попробуем Counter получить наиболее распространенный элемент:

 from collections import Counter

def most_common():
    for s in df.to_numpy():
        k, v = Counter(s).most_common(1)[0] 
        yield '-' if v == 1 else k

df['Result'] = list(most_common())
  

   col1 col2 col3 Result
0    A    A    B      A
1    A    B    B      B
2    C    B    C      C
3    A    B    C      -
  

Комментарии:

1. Добавлен еще один вариант @ShubhamSharma; надеюсь, с вами все в порядке.

2. @ShubhamSharma это работает только с первой найденной связью. после этого все результаты становятся любыми в столбце 3

3. Это здорово @sammywemmy 🙂

4. @Aira Можете ли вы привести пример для такого случая?

5. @ShubhamSharma используя приведенный выше пример, результат для строки 4 (A, B, C) равен «-«, а затем, если строка 5 равна C, B, A, то результатом будет не «-«, поэтому, когда я считаю после этого, я получил только 1 для «-»

Ответ №2:

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

 def appear_more_than_once(s):
    cnt = s.value_counts()
    if len(cnt) > 0 and cnt.iloc[0] > 1:
        return cnt.index[0]
    else:
        return '-'
        
df['Result'] = df.apply(appear_more_than_once, axis=1)
print(df)
#  col1 col2 col3 Result
#0    A    A    B      A
#1    A    B    B      B
#2    A    B    C      -
  

https://uscript.co/public/Google_108617488638529745626/python/4e5d36bc.py

Комментарии:

1. не вызывает большого беспокойства, поскольку набор данных не слишком большой, и это работает нормально. Спасибо