#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