У меня есть датафрейм, как показано ниже:

import pandas as pd
 
# intialise data of lists.
data = {'Name':['Tom', 'nick', 'krish', 'jack'],
        'Book1':[20, 21, 19, 18],
       'Book2':[20,'', 12, 20],
       'Book3':[31, 21, 17, 16],
       'Book4':[31, 19, 18, 16]}
 
# Create DataFrame
df = pd.DataFrame(data)
 
# Print the output.
print(df)
Name  Book1 Book2  Book3  Book4
Tom     20    20     31     31
nick    21           21     19
krish   19    12     17     18
jack    18    20     16     16

Я хочу получить результат ниже, в котором сравниваются столбцы Book1, Book2, Book3 и Book4. Для вывода строки Tom есть два 20 и два 31, так как число значений равно valent, поэтому в этом случае он предпочтет значение come fist, которое является Book1, поэтому столбец вывода равен 20. Для ника строки был два числа 21 и один номер 19, поэтому для выходного столбца будет выбрано наибольшее число вхождений, которое является номером 21. В то время как для строки криша не было повторяющегося номера, поэтому в выходном столбце я хочу исправить его как «Mix».

Столбец вывода, как показано ниже:

Name  Book1 Book2  Book3  Book4  Output
Tom     20    20     31     31     20
nick    21           21     19     21
krish   19    12     17     18     Mix
jack    18    20     16     16     16

У кого-нибудь есть идеи? Я видел, что есть функция режима, но она неприменима в этом случае, пожалуйста, помогите, спасибо

2
Shi Jie Tio 27 Ноя 2021 в 16:48

1 ответ

Лучший ответ

Используйте value_counts:

max_val = lambda x: x.value_counts().index[0] \
                        if x.value_counts().iloc[0] > 1 else 'Mix'

df['Output'] = df.filter(like='Book').apply(max_val, axis=1)
print(df)

# Output:
    Name  Book1 Book2  Book3  Book4 Output
0    Tom     20    20     31     31     20
1   nick     21           21     19     21
2  krish     19    12     17     18    Mix
3   jack     18    20     16     16     16

Обновить

Если вы используете Python >= 3.8, вы можете использовать оператор моржа (избегайте двойного вызова value_counts:

max_val = lambda x: v.index[0] if (v := x.value_counts()).iloc[0] > 1 else 'Mix'
df['Output'] = df.filter(like='Book').apply(max_val, axis=1)
6
Corralien 27 Ноя 2021 в 17:17
Я получаю 31 как результат для Тома
 – 
Nev1111
27 Ноя 2021 в 18:04
Вы повторно использовали мой код? Какая у вас версия Панд?
 – 
Corralien
27 Ноя 2021 в 18:09