使用引用dataframe从另一个dataframe获取值并应用计算

2024-06-08 22:00:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个dataframes一个dataframes包含四个列名,分别是Field\u name、Field\u Type、Unit\u Measurement和Asset name。而另一个数据帧则在一行中包含所有字段名称及其对应的值。 一个例子

import pandas as pd
df1 = pd.DataFrame({'Field_Name' : ['W_LD(1)', 'R_LD(3)', 'WMEAS_LD(1)', 'WMEAS_LD(2)','W_LN(1)','WMEAS_LN(1)'],
                    'Field_Type' : [est, est, meas, meas,est,meas], 
                    'Unit' : ['mw', 'mv', 'mw', 'mw','mw','mw'], 
                    'Asset_Name' : ['LD(1)', 'LD(3)', 'LD(1)', 'LD(2)','LN(1)','LN(1)']})


Second Dataframe [all the infromation rowwise]
import pandas as pd
df2=pd.Dataframe({['Device_names','W_LD(1)','R_LD(3)','WMEAS_LD(1)','WMEAS_LD(2)','W_LN(1)','WMEAS_LN(1)'],
                  ['Timestamp','2.2','3.3','1.2','3.4','2.3','4.5']})

现在,我们有两个数据帧。 所以,基本上我必须检查字段类型是估计的还是测量的,资产名称是LD(1),单位是'mw'还是'mv'

基于这些条件,我必须从第二个数据帧中提取WèLD(1)和WMEASèLD(1),并减去这两个值,然后输出将是(3.4-2.2)=1.2。这是针对一个设备,类似地,我必须针对多个设备


Tags: 数据nameimportfieldtypeunitassetmw
1条回答
网友
1楼 · 发布于 2024-06-08 22:00:50

如果您的DataFrame是:

df1 = pd.DataFrame({'Field_Name' : ['W_LD(1)', 'R_LD(3)', 'WMEAS_LD(1)', 'WMEAS_LD(2)','W_LN(1)','WMEAS_LN(1)'],
                    'Field_Type' : ['est', 'est', 'meas', 'meas','est','meas'], 
                    'Unit' : ['mw', 'mv', 'mw', 'mw','mw','mw'], 
                    'Asset_Name' : ['LD(1)', 'LD(3)', 'LD(1)', 'LD(2)','LN(1)','LN(1)']})

df2=pd.DataFrame({'Device_names':['W_LD(1)','R_LD(3)','WMEAS_LD(1)','WMEAS_LD(2)','W_LN(1)','WMEAS_LN(1)'],
                  'Timestamp':['2.2','3.3','1.2','3.4','2.3','4.5']})

1.解决方案。

groups=df1.groupby(df1['Asset_Name'])
df1['Timestamp']=df1['Field_Name'].map(df2.set_index('Device_names')['Timestamp'])
df1['Timestamp']=[float(key) for key in df1['Timestamp']]
df1.sort_values('Timestamp',inplace=True)
df1.reset_index(drop=True,inplace=True)
df1['subtract']=groups['Timestamp'].diff()
df1['subtract']=groups['subtract'].transform('first')

2.说明。

groupby要计算每组的减法:

groups=df1.groupby(df1['Asset_Name'])

首先使用Series.map按正确的顺序在df1中插入Timestamp列。 使用DataFrame.sort_values订购​​得到带正号的减法

df1['Timestamp']=df1['Field_Name'].map(df2.set_index('Device_names')['Timestamp'])
df1['Timestamp']=[float(key) for key in df1['Timestamp']]
df1.sort_values('Timestamp',inplace=True)
df1.reset_index(drop=True,inplace=True)

然后使用groupby.DataFrameGroupBy.diff

df1['subtract']=groups['Timestamp'].diff()
print(df1)


    Field_Name Field_Type Unit Asset_Name  Timestamp  subtract
0  WMEAS_LD(1)       meas   mw      LD(1)        1.2       NaN
1      W_LD(1)        est   mw      LD(1)        2.2       1.0
2      W_LN(1)        est   mw      LN(1)        2.3       NaN
3      R_LD(3)        est   mv      LD(3)        3.3       NaN
4  WMEAS_LD(2)       meas   mw      LD(2)        3.4       NaN
5  WMEAS_LN(1)       meas   mw      LN(1)        4.5       2.2

然后使用transform

df1['subtract']=groups['subtract'].transform('first')
print(df1)

    Field_Name Field_Type Unit Asset_Name  Timestamp  subtract
0  WMEAS_LD(1)       meas   mw      LD(1)        1.2       1.0
1      W_LD(1)        est   mw      LD(1)        2.2       1.0
2      W_LN(1)        est   mw      LN(1)        2.3       2.2
3      R_LD(3)        est   mv      LD(3)        3.3       NaN
4  WMEAS_LD(2)       meas   mw      LD(2)        3.4       NaN
5  WMEAS_LN(1)       meas   mw      LN(1)        4.5       2.2

相关问题 更多 >