Поиск значений из одного DataFrame, чтобы создать dict из другого - PullRequest
2 голосов
/ 01 марта 2020

Я очень новичок в Python и столкнулся с проблемой, которую не мог решить.

У меня есть два извлеченных столбца Dataframe, которые необходимо учитывать, например,

df1 
    Student ID                                          Subjects
0           S1                Maths, Physics, Chemistry, Biology
1           S2                       Maths, Chemistry, Computing
2           S3                       Maths, Chemistry, Computing
3           S4                         Biology, Chemistry, Maths
4           S5               English Literature, History, French
5           S6                       Economics, Maths, Geography
6           S7               Further Mathematics, Maths, Physics
7           S8                    Arts, Film Studies, Psychology
8           S9   English Literature, English Language, Classical
9          S10                        Business, Computing, Maths

df2
   Subject ID             Subjects
58      Che13            Chemistry
59      Bio13              Biology
60      Mat13                Maths
61     FMat13  Further Mathematics
62      Phy13              Physics
63      Eco13            Economics
64      Geo13            Geography
65      His13              History
66  EngLang13     English Langauge
67   EngLit13   English Literature

Как я могу сравнить для каждого предмета df2, если есть студент, изучающий этот предмет, создать словарь с ключом «Идентификатор субъекта» и значениями «Идентификатор студента»?

Желаемый результат будет примерно таким;

Che13:[S1, S2, S3, ...]
Bio13:[S1,S4,...]

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Используйте explode и map, затем вы можете выполнить небольшую группировку, чтобы получить вывод:

(df.set_index('Student ID')['Subjects']
   .str.split(', ')
   .explode()
   .map(df2.set_index('Subjects')['Subject ID'])
   .reset_index()
   .groupby('Subjects')['Student ID']
   .agg(list))

Subjects
Bio13                            [S1, S4]
Che13                    [S1, S2, S3, S4]
Eco13                                [S6]
EngLit13                         [S5, S9]
FMat13                               [S7]
Geo13                                [S6]
His13                                [S5]
Mat13       [S1, S2, S3, S4, S6, S7, S10]
Phy13                            [S1, S7]
Name: Student ID, dtype: object

Отсюда, вызовите .to_dict(), если хотите получить результат в словаре.

0 голосов
/ 01 марта 2020

Не pythoni c, а просто

{row['Subject ID'] : 
      df1[df1.Subjects.str.contains(row['Subjects'])]['Student ID'].to_list() 
      for _, row in df2.iterrows()}

Что мы делаем:

Перебираем все предметы и проверяем, лежит ли строка предмета в предметах, взятых студентом. Если так, получите студенческий билет.

...