#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. не вызывает большого беспокойства, поскольку набор данных не слишком большой, и это работает нормально. Спасибо