簡體   English   中英

將數據框行(熊貓)與單獨的數據框行匹配,如果第一列匹配則執行計算

[英]Matching a data frame row (pandas) to a separate data frame row and performing a calculation if the first column matches

新手 python/coder 試圖使數據記錄器的下載和計算過程更順暢,作為一個副項目。 無論如何,我有兩個數據框。 第一個是“數據”,其中包含以下內容(為簡單起見縮短了行數):

    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 - Sensor Reading(dg)] * abs(量具系數)。 現在,如果“param”只有一個傳感器 ID 和與“data”相同的行數,這不是問題,但實際上它有很多具有不同 ID 的行。

所以我的問題是這樣的。 實現我的目標的最佳方法是什么? 是在列上循環還是使用 pandas 庫更有效?

提前致謝!

編輯:我要找的output就是這個

    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. 使用( https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html )加入兩個數據框。
  2. 計算結果 dataframe ( 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)

只是想出了一種看起來非常有效的方法。 我只是刪除了不需要的“param”中的數據:

z = data.iloc[0,0]
param = param[param.Transducer_ID == z]

過濾數據后,我只從參數中提取所需的值:

x = piezo_param.iloc[0, 7]
y = piezo_param.iloc[0, 6]

並執行計算:

data['Linear P'] = (x - data['Sensor Reading(dg)']) * abs(y)

讓我知道這是否是完成工作的最佳方式!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM