Как сопоставить столбец списка со столбцом в другом кадре данных в пандах? - PullRequest
0 голосов
/ 07 июня 2019

У меня есть датафрейм, который выглядит примерно так:

main_df:

student name | program_ids
-----------------------------
Alex         | [1,2,7]
Tim          | [37]
May          | [17,1,11]
Gloria       | NaN
James        | [37,42]
Nina         | []

prog_df:

 prog_id    | program
 -------------------------
 1          | Arts
 2          | Music
 37         | Languages
 11         | Physics
 17         | Chemistry
 42         | Math
 7          | Dance

Я бы хотел сопоставить мой "main_df" с "prog_df" в столбце "program_id", чтобы:

Я получаю фрейм данных вот так:

student name | program
-----------------------
Alex         | Arts, Music, Dance
Tim          | Languages
May          | Chemistry, Arts, Physics
Gloria       | NaN
James        | Languages, Math
Nina         | NaN

Есть ли способ сопоставить элементы списка столбца панд со значениями столбца в другом кадре данных?

Спасибо

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Сначала небольшая предварительная обработка:

df['program_ids'] = df['program_ids'].map(lambda x: [] if pd.isnull(x) else x)
df

  student name  program_ids
0         Alex    [1, 2, 7]
1          Tim         [37]
2          May  [17, 1, 11]
3       Gloria           []
4        James     [37, 42]
5         Nina           []

Затем создайте отображение идентификатора программы на значения:

mapping = dict(prog_df.values)

Используйте это для привязки идентификаторов к программам с пониманием списка (для исполнения):

df['program_ids']  = [[mapping.get(x) for x in  l] for l in df['program_ids']]
df

  student name                 program_ids
0         Alex        [Arts, Music, Dance]
1          Tim                 [Languages]
2          May  [Chemistry, Arts, Physics]
3       Gloria                          []
4        James           [Languages, Math]
5         Nina                          []

И, наконец, в качестве необязательного шага для объединения списков используйте str.join:

df['program_ids'].str.join(',').replace('', np.nan)

0          Arts,Music,Dance
1                 Languages
2    Chemistry,Arts,Physics
3                       NaN
4            Languages,Math
5                       NaN
Name: program_ids, dtype: object
3 голосов
/ 07 июня 2019

Вы можете сделать с

df1.loc[df1.program_ids.isnull(),'program_ids']=[[]]
d=dict(zip(df2.prog_id,df2.program))
df1['New']=[','.join([d.get(y) for y in x] )for x in df1.program_ids]
df1
Out[15]: 
  studentname  program_ids                     New
0        Alex    [1, 2, 7]        Arts,Music,Dance
1         Tim         [37]               Languages
2         May  [17, 1, 11]  Chemistry,Arts,Physics
3      Gloria           []                        
4       James     [37, 42]          Languages,Math
5        Nina           []                        
...