Сложная связь между 2 кадрами данных

#python #python-3.x #pandas #dataframe

Вопрос:

У меня есть 2 кадра данных. Во-первых, это моя рекомендация

 df_ref
ID  REF  VALUE
A   1    12
A   2    36
A   3    95
B   1    54
B   2    67
B   3    81
C   1    89
C   2    123
C   3    14
 

И второе-мое ограниченное :

 df_restrict
ID  V1  V2
A   1   2
B   3   2
C   2   1
 

Что я хочу, так это заменить V1 и V2 на df_restrict значения, соответствующие (ID, REF) от df_ref

 df_restrict
ID  V1  V2
A   12  36
B   81  67
C   123 89
 

Заранее спасибо

Ответ №1:

Мы можем повернуть df_ref , чтобы изменить форму , затем установить индекс df_restrict на ID , затем перенести и заменить значения из измененного df_ref

 r = df_ref.pivot('REF', 'ID', 'VALUE')
df_restrict.set_index('ID').T.replace(r).T
 

      V1  V2
ID         
A    12  36
B    81  67
C   123  89
 

Ответ №2:

melt второй кадр данных, чтобы вы могли merge получить значения в обоих столбцах ['ID', 'REF'] , а затем pivot вернуться к исходной форме.

 df1 = (df_restrict.melt(id_vars=['ID'], value_name='REF')
        .merge(df_ref, how='left')
        .pivot(index='ID', columns='variable', values='VALUE')
        .rename_axis(columns=None))

#     V1  V2
#ID         
#A    12  36
#B    81  67
#C   123  89
 

Ответ №3:

Вот мое предложение:

 df_restrict['V1']=df_restrict.merge(df_ref, left_on=['ID', 'V1'], right_on=['ID', 'REF'])['VALUE']

df_restrict['V2']=df_restrict.merge(df_ref, left_on=['ID', 'V2'], right_on=['ID', 'REF'])['VALUE']

>>> print(df_restrict)
  ID   V1  V2
0  A   12  36
1  B   81  67
2  C  123  89
 

Ответ №4:

Попробуй что-нибудь

 out = df_restrict.set_index('ID').T.replace(df_ref.pivot(*df_ref.columns).T).T
Out[188]: 
     V1  V2
ID         
A    12  36
B    81  67
C   123  89