Фильтрация и присвоение значений в фрейме данных pandas - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть фрейм данных, который выглядит следующим образом:

Date    Student    Subject    Score
10/1    Luke       English    65
10/1    Alex       English    75     
10/2    Luke       Maths      50     
10/3    Lily       Maths      45     
10/3    Alex       Maths      90     
10/4    Lily       English    60     
10/5    Alex       English    70     
10/6    Luke       English    55     
10/6    Luke       Maths      65     
10/7    Lily       Maths      80     
10/8    Alex       Maths      75     
10/8    Lily       English    90     

Я пытаюсь выполнить две задачи здесь, и выходные данные должны быть три новых столбца в фрейме данных:

1. Date of last/next test:

Для каждой строки я хочу посмотреть дату следующего теста для ТОГО ЖЕ СТУДЕНТА И СУБЪЕКТА.Например, «дата следующего теста» для строк 1 и 2 должна быть соответственно «10/6» и «10/5».

Аналогично, для последней строки «дата предыдущего теста» должно иметь значениеиз '10 / 4'.

2. Change in score:

В этом столбце я надеюсь вернуть изменение в баллах на основе последнего теста учащегося по данному предмету.Например, значения для строк 6-8 должны быть «nan», «- 5» и «-10».

Спасибо за помощь заранее!

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете использовать groupby и shift для решения ваших проблем, как показано ниже.Используйте fillna() для замены Nan значений.

Задача-1 : Найдите дату последнего и следующего теста:

In [941]: df['next_test_dt'] = df.groupby(['Student','Subject'])['Date'].shift(-1).fillna(df['Date'])

In [943]: df['last_test_dt'] = df.groupby(['Student','Subject'])['Date'].shift(1).fillna(df['Date'])

In [944]: df
Out[944]: 
    Date Student  Subject  Score next_test_dt last_test_dt
0   10/1    Luke  English     65         10/6         10/1
1   10/1    Alex  English     75         10/5         10/1
2   10/2    Luke    Maths     50         10/6         10/2
3   10/3    Lily    Maths     45         10/7         10/3
4   10/3    Alex    Maths     90         10/8         10/3
5   10/4    Lily  English     60         10/8         10/4
6   10/5    Alex  English     70         10/5         10/1
7   10/6    Luke  English     55         10/6         10/1
8   10/6    Luke    Maths     65         10/6         10/2
9   10/7    Lily    Maths     80         10/7         10/3
10  10/8    Alex    Maths     75         10/8         10/3
11  10/8    Lily  English     90         10/8         10/4

Задача-2 : Найти разницу между результатами последнего теста:

In [954]: df['score_diff'] = df['Score'] - df.groupby(['Student','Subject'])['Score'].shift(1)

In [957]: df
Out[957]: 
    Date Student  Subject  Score next_test_dt last_test_dt  score_diff
0   10/1    Luke  English     65         10/6         10/1         NaN
1   10/1    Alex  English     75         10/5         10/1         NaN
2   10/2    Luke    Maths     50         10/6         10/2         NaN
3   10/3    Lily    Maths     45         10/7         10/3         NaN
4   10/3    Alex    Maths     90         10/8         10/3         NaN
5   10/4    Lily  English     60         10/8         10/4         NaN
6   10/5    Alex  English     70         10/5         10/1        -5.0
7   10/6    Luke  English     55         10/6         10/1       -10.0
8   10/6    Luke    Maths     65         10/6         10/2        15.0
9   10/7    Lily    Maths     80         10/7         10/3        35.0
10  10/8    Alex    Maths     75         10/8         10/3       -15.0
11  10/8    Lily  English     90         10/8         10/4        30.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...