#python #pandas #dataframe
Вопрос:
новичок в python/программист, который пытается сделать загрузку и вычисления регистратора данных более плавным процессом в качестве побочного проекта. В любом случае, у меня есть два кадра данных. Первый-это «данные», которые содержат следующее (количество строк сокращено для простоты):
Logger Name Date and Time Battery Temp(C) Sensor Reading(dg) Sensor Temp(C) Array #
0 TDX 10/1/2021 13:35 2.93 15.59 8772.737 14.5 833
1 TDX 10/1/2021 13:36 2.93 15.59 8773.426 14.5 834
2 TDX 10/1/2021 13:36 2.93 15.59 8773.570 14.5 835
3 TDX 10/1/2021 13:37 2.93 15.59 8773.793 14.5 836
Второй — «param», который имеет параметры, содержащие значения, которые я использую для выполнения вычислений:
Transducer_ID elevation_tom elevation_toc elevation_ground elevation_tos calculation gage_factor xd_zero_reading thermal_factor xd_temp_at_zero_reading piezo_elev piezo_downhole_depth
0 TDX NaN NaN 1000 NaN linear -0.04135 9138 0.003119 24.8 1600 400
1 Test NaN NaN 1000 NaN linear -0.18320 8997 -0.170100 22.6 800 200
Теперь я надеюсь, что код сможет создать новый столбец в «данных» под названием «Линейный P», который заполняется на основе этого вычисления, в котором используются переменные из обоих фреймов данных:
[digits_zero_digits — Показания датчика(dg)] * abs(gage_factor). Теперь это не проблема, если бы у «param» был только один идентификатор преобразователя и то же количество строк, что и у «данных», но на самом деле в нем много строк с разными идентификаторами.
Поэтому мой вопрос таков. Каков наилучший способ достижения моей цели? Это для обхода столбца или есть что-то более эффективное с использованием библиотеки pandas?
Заранее спасибо!
редактировать: вывод, который я ищу, заключается в следующем
Logger Name Date and Time Battery Voltage(v) Internal Temp(C) Sensor Reading(dg) Sensor Temp(C) Array # Linear P
0 TDX 10/1/2021 13:35 2.93 15.59 8772.737 14.5 833 15.103625
1 TDX 10/1/2021 13:36 2.93 15.59 8773.426 14.5 834 15.075135
2 TDX 10/1/2021 13:36 2.93 15.59 8773.570 14.5 835 15.069181
3 TDX 10/1/2021 13:37 2.93 15.59 8773.793 14.5 836 15.059959
Ответ №1:
Просто придумал способ сделать это, который кажется довольно эффективным. Я просто удаляю данные в «параме», которые мне не нужны:
z = data.iloc[0,0]
param = param[param.Transducer_ID == z]
Отфильтровав данные, я извлекаю из param только необходимые значения:
x = piezo_param.iloc[0, 7]
y = piezo_param.iloc[0, 6]
И выполните расчет:
data['Linear P'] = (x - data['Sensor Reading(dg)']) * abs(y)
Дайте мне знать, если это кажется лучшим способом выполнить работу!
Ответ №2:
Более эффективный способ был бы основан на моем опыте :
- соедините два фрейма данных с помощью (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html).
- произведите расчет по результирующему кадру данных (
df["Linear P"] = df["Sensor Reading(dg)"] * ... ) .
вот пример моего процесса :
import pandas as pd
df1 = pd.DataFrame({'Names': ['a', 'a'],
'var1': [35, 15,],
'var2': [15, 40]})
df2 = pd.DataFrame({'Names1': ['a', 'E'],
'var3': [35, 15,],
'var4': [15, 40]})
final_df = df1.merge(df2, left_on='Names', right_on='Names1', how='left' )
final_df["Linear P"] = final_df["var3"] * final_df["var2"] - abs(final_df["var2"])
print(final_df)
Комментарии:
1. Не могли бы вы немного подробнее рассказать мне об этом? До сих пор я пытался создавать переменные на основе значений параметров, которые мне нужны: ‘y = param.iloc[данные(‘Имя регистратора’, 7)]’ y = param.iloc[данные(‘Имя регистратора’, 6)]’, а затем ‘данные[‘Линейный P’] = (x — данные[‘Показания датчика(dg)’]) * abs(y)’, но это не работает.