Нахождение среднего значения различий между каждой строкой?

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

cols = ['Name', 'Math', 'Science', 'English', "History"]
data = [['Tom', 100, 93, 95, 92], ['Nick', 89, 75, 82, 57], ['Julie', 99, 89, 76, 88], ['Sarah', 79, 78, 94, 88]]
df = pd.DataFrame(data, columns=cols)
df

Вывод такой:

Моя текущая (и нерабочая) формула:

students = ['Tom', 'Nick', 'Julie', 'Sarah']
differences = []

def student_diff(student):
    for col in df.columns[1:]:
        for classmate in students:
            differences.append(abs(student[col] - classmate[col]))
            print (student, differences.mean())
              
student_diff('Tom')

Ошибка:

TypeError: string indices must be integers

В общем, я надеялся, что вывод будет примерно таким (например, с Томом):

Nick 19.25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
# student to find difference
student = 'Tom'
# create your mask where the name is the student name 
mask = df['Name'].eq(student)
# concat you masks together and set the index
data = pd.concat([df[mask], df[~mask]]).set_index('Name')
# get the mean from the differnce
abs(data.iloc[0, :] - data.iloc[1:, :]).mean(axis=1)

Name
Nick     19.25
Julie     7.00
Sarah    10.25
dtype: float64

или если вам нужна функция

def student_diff(df: pd.DataFrame, student: str) -> pd.Series:
    # create your mask where the name is the student name 
    mask = df['Name'].eq(student)
    # concat you masks together and set the index
    data = pd.concat([df[mask], df[~mask]]).set_index('Name')
    # get the mean from the differnce
    return abs(data.iloc[0, :] - data.iloc[1:, :]).mean(axis=1)


student_diff(df=df, student='Nick')

Name
Tom      19.25
Julie    15.25
Sarah    14.00
dtype: float64

Мне нравится ваше решение. Меня особенно интересует одна вещь. В чем разница в поведении при использовании data.iloc[0] и data.iloc[0, :]? Я не вижу ни одного, но я также относительный новичок в NumPy и Pandas. Ваше здоровье!

Philip Wrage 18.04.2023 17:09

@PhilipWrage нет никакой разницы, так как мы не нарезаем столбцы. То же самое с data.iloc[1:] и data.iloc[1:, :]. Я просто иногда включаю второй :, если знаю, что захочу/нужно вернуться и разрезать столбцы позже. Так что, если вам интересно узнать разницу во всем, кроме математики, вы можете просто добавить return abs(data.iloc[0, 1:] - data.iloc[1:, 1:]).mean(axis=1)

It_is_Chris 18.04.2023 17:16

это имеет смысл. Вы используете первый индекс для определения строки (или фрагмента строки), который вам нужен, а второй индекс идентифицирует интересующий вас столбец (или фрагмент столбца). Указав фрагмент : в качестве второго индекса, вы говорите, что хотите каждый столбец, что было бы поведением по умолчанию, но вы оставляете заполнитель для корректировки этого в будущих расчетах. Спасибо за разъяснение!

Philip Wrage 18.04.2023 17:31

@PhilipWrage да, ты попал. Вы можете найти дополнительную информацию об индексации и выборе данных с пандами здесь

It_is_Chris 18.04.2023 17:37

Другие вопросы по теме