Доброе утро всем. Я пытаюсь найти различия между двумя строками. Я пытаюсь составить формулу, но мне кажется, что я слишком усложняю, когда может быть доступен более простой ответ, а мой код не идеален. Вот мой пример набора данных.
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
# 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
@PhilipWrage нет никакой разницы, так как мы не нарезаем столбцы. То же самое с data.iloc[1:]
и data.iloc[1:, :]
. Я просто иногда включаю второй :
, если знаю, что захочу/нужно вернуться и разрезать столбцы позже. Так что, если вам интересно узнать разницу во всем, кроме математики, вы можете просто добавить return abs(data.iloc[0, 1:] - data.iloc[1:, 1:]).mean(axis=1)
это имеет смысл. Вы используете первый индекс для определения строки (или фрагмента строки), который вам нужен, а второй индекс идентифицирует интересующий вас столбец (или фрагмент столбца). Указав фрагмент :
в качестве второго индекса, вы говорите, что хотите каждый столбец, что было бы поведением по умолчанию, но вы оставляете заполнитель для корректировки этого в будущих расчетах. Спасибо за разъяснение!
@PhilipWrage да, ты попал. Вы можете найти дополнительную информацию об индексации и выборе данных с пандами здесь
Мне нравится ваше решение. Меня особенно интересует одна вещь. В чем разница в поведении при использовании
data.iloc[0]
иdata.iloc[0, :]
? Я не вижу ни одного, но я также относительный новичок в NumPy и Pandas. Ваше здоровье!