Сопоставление строки фрейма данных (pandas) с отдельной строкой фрейма данных и выполнение вычисления, если первый столбец совпадает

#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:

Более эффективный способ был бы основан на моем опыте :

  1. соедините два фрейма данных с помощью (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html).
  2. произведите расчет по результирующему кадру данных ( 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)’, но это не работает.