Pandas Groupby с условием на один столбец, чтобы заполнить другой столбец - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть следующий фрейм данных df_address, содержащий адреса студентов

student_id     address_type     Address          City      
 1                R              6th street      MPLS              
 1                P              10th street SE  Chicago           
 1                E              10th street SE  Chicago           
 2                P              Washington ST   Boston            
 2                E              Essex St        NYC               
 3                E              1040 Taft Blvd  Dallas            
 4                R              24th street      NYC             
 4                P              8th street SE  Chicago           
 5                T              10 Riverside Ave Boston
 6                                20th St          NYC          

У каждого студента может быть несколько типов адресов:

R обозначает "Жилой", P обозначает "Постоянный", Eдля «Emergency», T для «Temporary» и addr_type также могут быть пустыми

Я хочу заполнить столбцы «IsPrimaryAddress» на основе следующей логики:

Если для конкретного студента существует address_type Rтогда «Да» должно быть написано перед типом адреса «R» в столбце IsPrimaryAddress, а «Нет» должно быть записано перед другими типами адреса для этого конкретного student_id.

, если address_type R не существует, ноP существует тогда IsPrimaryAddress = 'Да' для 'P' и 'Нет' для остальных типов

, если ни P, ни R не существует, но E существует, тогда IsPrimaryAddress = 'Yes' для 'E', если P,R или E не существует, но 'T' существует, тогда IsPrimaryAddress = 'Yes' для 'T' Результирующий фрейм данных будет выглядеть следующим образом:

student_id     address_type     Address          City      IsPrimaryAddress
 1                R              6th street      MPLS              Yes
 1                P              10th street SE  Chicago           No
 1                E              10th street SE  Chicago           No
 2                P              Washington ST   Boston            Yes
 2                E              Essex St        NYC               No
 3                E              1040 Taft Blvd  Dallas            Yes
 4                R              24th street      NYC             Yes
 4                P              8th street SE  Chicago           No
 5                T              10 Riverside Ave Boston          Yes
 6                                20th St          NYC           Yes

Как мне этого добиться? Я пробовал rank и cumcountFUNCна address_type, но не может заставить их работать.

1 Ответ

0 голосов
/ 16 декабря 2018

При первом использовании Categorical make address_type можно сортировать по индивидуальному заказу

df.address_type=pd.Categorical(df.address_type,['R','P','E','T',''],ordered=True)

df=df.sort_values('address_type') # the sort the values
df['new']=(df.groupby('student_id').address_type.transform('first')==df.address_type).map({True:'Yes',False:'No'}) # since we sorted the value , so the first value of each group is the one we need to mark as Yes
df=df.sort_index() # sort the index order back to the original df


   student_id address_type  new
0           1            R  Yes
1           1            P   No
2           1            E   No
3           2            P  Yes
4           2            E   No
5           3            E  Yes
6           4            R  Yes
7           4            P   No
8           5            T  Yes
9           6               Yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...