Привет, я пытаюсь создать новый столбец в моем фрейме данных, и я хочу, чтобы значения основывались на вычислении. Расчет составляет - score доля Student в Class. В разных классах учатся 2 разных ученика с одинаковыми именами, поэтому первый group by ниже находится на Class и Student обоих.

df['share'] = df.groupby(['Class', 'Student'])['Score'].agg('sum')/df.groupby(['Class'])['Score'].agg('sum')

Используя приведенный выше код, я получаю сообщение об ошибке incompatible index of inserted column with frame index.

Может кто-нибудь помочь. Благодарность

0
Chipmunk_da 9 Окт 2021 в 23:28

2 ответа

Лучший ответ

Если я вас правильно понял, то приведу пример df следующего вида:

    Class Student  Score        
1       1       1     99
2       1       2     60
3       1       3     90
4       1       4     50
5       2       1     93
6       2       2     93
7       2       3     67
8       2       4     58
9       3       1     54
10      3       2     29
11      3       3     34
12      3       4     46

Вам нужен следующий результат?

    Class Student  Score  Score_Share
1       1       1     99     0.331104
2       1       2     60     0.200669
3       1       3     90     0.301003
4       1       4     50     0.167224
5       2       1     93     0.299035
6       2       2     93     0.299035
7       2       3     67     0.215434
8       2       4     58     0.186495
9       3       1     54     0.331288
10      3       2     29     0.177914
11      3       3     34     0.208589
12      3       4     46     0.282209

Если это так, этого можно достичь с помощью:

    df['Score_Share'] = df.groupby('Class')['Score'].apply(lambda x: x / x.sum())

Вы можете применять такие операции в пределах каждой группы.

PS. Я не знаю, почему ученик с таким же именем в другом классе может быть проблемой, так что, возможно, я что-то не понимаю. Я отредактирую это в соответствии с вашим ответом. Не могу комментировать, потому что я здесь новичок :)

1
Joseph Doun 9 Окт 2021 в 22:48

Проблема в агрегате groupby и индексе - это уникальные значения столбца, который вы группируете. И в вашем случае оценка SHARE - это оценка класса, а не учащегося, и это устанавливает новый фрейм данных с общей оценкой каждого учащегося. Так я понял вашу проблему.

ndf = df.groupby(['Class', 'Student'])['Score'].agg('sum')/df.groupby(['Class'])['Score'].agg('sum')
ndf = ndf.reset_index()
ndf
2
claudio paulo 9 Окт 2021 в 21:35