我有两只熊猫的资料:
df_func = pd.DataFrame({
'col_ref': [1, 4],
'value1': [12.0, 13.1], 'value2': [55.1, 22.1],
'value3': [22.2, 10.0], 'value4': [111, 0],
})
df_val = pd.DataFrame(
{'col_ref': [4, 1], 'value': [13.1, 1.0]}
)和4个变量max_deviation_value1 max_deviation_value2 max_deviation_value3 max_deviation_value4,其中包含df_func中每列允许的最大偏差。
例如,例如:
max_deviation_value1 = 1.5
max_deviation_value2 = 2
max_deviation_value3 = 4
max_deviation_value4 = 2.3如何比较df_val的value列中的每一行与df_func中所有列的对应值(当col_ref是相同的),并检查偏差是否在相应的可接受的最大偏差值之内?
虽然col_ref是两个DataFrames的行之间的公共链接,但它的顺序不一定相同。
发布于 2021-12-26 14:22:08
第一步是确保col_ref是每个DataFrame的索引,以便使其余的操作更容易。如果已经不是这样的话,那么:
df_func = df_func.set_index('col_ref')
df_val = df_val.set_index('col_ref')然后,我们需要向熊猫指出,我们的意思是按行减去df_val's 'value' (从value{i}的每一列中):
diff = df_func.subtract(df_val.squeeze(), axis=0)
>>> diff
value1 value2 value3 value4
col_ref
1 11.0 54.1 21.2 110.0
4 0.0 9.0 -3.1 -13.1现在,关于max_deviation值:最简单的方法是将它们放在一个系列中。例如:
max_deviation = pd.Series(dict(
value1=1.5,
value2=2.0,
value3=4.0,
value4=2.3,
))然后,这个比较实际上是这样写的:
>>> diff.abs() <= max_deviation
value1 value2 value3 value4
col_ref
1 False False False False
4 True False True False增编
在注释中,OP提到df_func中可能存在重复的df_func值。在这种情况下,可以应用以下逻辑:
# for example: duplicate col_ref == 1 in df_func
df_func = pd.DataFrame({
'col_ref': [1, 4, 1],
'value1': [12.0, 13.1, 5.0],
'value2': [55.1, 22.1, 5.1],
'value3': [22.2, 10.0, 2.2],
'value4': [111, 0, 11],
}).set_index('col_ref')然后,无论有多少行,以下代码都将正确地删除df_val value' for each corresponding col_ref`行:
diff = df_func - df_val.reindex(df_func.index).values
>>> diff
value1 value2 value3 value4
col_ref
1 11.0 54.1 21.2 110.0
4 0.0 9.0 -3.1 -13.1
1 4.0 4.1 1.2 10.0
>>> diff.abs() <= max_deviation
value1 value2 value3 value4
col_ref
1 False False False False
4 True False True False
1 False False True False最后注意事项
如果df_val 也包含col_ref的重复条目,那么我们可以去重复(例如,取第一个条目):
# if done after `col_ref` has already been made the index
df_val = df_val.reset_index().drop_duplicates(subset='col_ref', keep='first').set_index('col_ref')https://stackoverflow.com/questions/70486810
复制相似问题