Обновление столбцов в фрейме данных для строк, существующих в справочном / справочном фрейме данных

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных, который содержит некоторые данные, которые были неправильно масштабированы, поэтому мне нужно применить вычисление коррекции к 4 столбцам, ЕСЛИ эта строка / значение существует в эталонном фрейме данных

 df:
devicename|   val1   |   val2   |   val3   |  val4   |    val5    |   val6   |
=============================================================================
dev1         100        200        300       400         500         600
dev2         200        300        400       500         600         700    

sig_ref:
devicename|signalname
=======================
dev1         val1
dev1         val3
dev1         val5
 

итак, для каждого устройства / значения в sig_ref мне нужно найти все строки в df с этим устройством и разделить df[имясигнала] на 10. В приведенном ниже примере конечным результатом будет df dev1.val1= 10, val3 = 30, val5 = 50 и т.д.

Что я сделал:

 sig_ref = pd.read_csv('./Signals.csv')

df = pd.read_parquet(file)
for index, row in sig_ref.iterrows():
  print('Finding: ', row['devicename'], row['signalname'])
  sig = (row['signalname']).lower()
  print(sig)
  df.loc[df['devicename'] == row['devicename']][sig]/10
 

Я также пробовал запутанный ‘isin’, но не смог понять, как затем выбрать signalnames из ссылочного фрейма данных

Ответ №1:

Затем вы можете попробовать melt merge , изменить значения, а затем повернуть назад:

 (df.melt('devicename', var_name='signalname')
   .merge(sig_ref, indicator=True, how='left')
   .assign(value = lambda x: np.where(x['_merge']=='both', x['value']/10, x['value'])
          )
   .pivot(index='devicename', columns='signalname', values='value')
)
 

Вывод:

 signalname   val1   val2   val3   val4   val5   val6
devicename                                          
dev1         10.0  200.0   30.0  400.0   50.0  600.0
dev2        200.0  300.0  400.0  500.0  600.0  700.0