Объедините два кадра данных разной длины при определенном условии

#python #pandas #dataframe

Вопрос:

У меня есть первый фрейм данных «Исследование»: это имена всех студентов в колледже

 col1
A
B
C
D
E
F
 

и мой 2-й фрейм данных — «Студент»: это определенная группа студентов с определенным предметом

 name   pass
C       1
F       1
B       1
 

Я хочу создать фрейм данных из вышеперечисленных 2 фреймов данных, который выглядит примерно так:

фрейм данных 3:

 col1 value
A      False
B      True
C      True
D      False
E      False
F      True
 

Это означает, что учащиеся B, C и F имеют значение 1 в кадре данных «Учащийся», а остальные все отсутствуют.

Я попытался сделать это, используя метод слияния в панд, что-то вроде этого:

 df3 = Study.merge(Student, left_on="col1", right_on="name", how="left")
 

но это приводит к:

 col1     name    pass
A        nan     nan
B        B       1
C        C       1
D        nan     nan
E        nan     nan
F        F       1
 

Чтобы получить фрейм данных 3, показанный выше — я могу обработать это, удалив имя столбца и, возможно, заменив nan на false и 1 на True, но есть ли другой способ сделать это более красиво.

Ответ №1:

Вы можете проверить, есть ли df1['col1'] в df2['name'] :

 df3 = df1.assign(value=df1['col1'].isin(df2['name']))
df3
 

Выход:

   col1  value
0    A  False
1    B   True
2    C   True
3    D  False
4    E  False
5    F   True
 

Ответ №2:

Возьмите только необходимые столбцы после слияния , т. е. col1 и pass , и заполните NaN значения False

 df3=Study.merge(Student, left_on="col1", right_on="name", how="left")[['col1', 'pass']].fillna(False)
 

Теперь просто преобразуйте столбец pass в boolean тип

 df3['pass'] = df3['pass'].astype(bool)
 

выход:

 df3
  col1   pass
0    A  False
1    B   True
2    C   True
3    D  False
4    E  False
5    F   True
 

Вы можете переименовать столбцы, если хотите..

Ответ №3:

Если ваш 2-й фрейм данных «Студент» не просто содержит все переданные значения 1 (может быть 0), вы также можете сделать:

 df_merge = Study.merge(Student, left_on='col1', right_on='name', how='left')
df_merge['value'] = df_merge['pass'].eq(1)
df_merge = df_merge.drop(['name', 'pass'], axis=1)
 

Результат:

 print(df_merge)

  col1  value
0    A  False
1    B   True
2    C   True
3    D  False
4    E  False
5    F   True