首页 > 解决方案 > 为引用/查找数据框中存在的行更新数据框中的列

问题描述

我有一个数据框,其中一些数据的缩放比例不正确,所以我需要对 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[signalname] 除以 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”,但不知道如何从参考数据帧中选择信号名

标签: pythonpandasdataframe

解决方案


您可以尝试meltthen 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

推荐阅读