#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