【问题标题】:Comparing values in two pandas dataframes within a maximum deviation在最大偏差内比较两个熊猫数据框中的值
【发布时间】:2022-01-25 21:45:39
【问题描述】:

我有 2 个熊猫数据框:

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

col_ref 相同时,如何将df_valvalue 列中的每一行与df_func 中所有列的对应值进行比较,并检查偏差是否在相应的可接受的最大偏差值范围内?

Obs.:虽然col_ref 是两个 DataFrame 的行之间的公共链接,但不一定顺序相同。

【问题讨论】:

  • 请提供一个易于复制/粘贴的最小可复制示例(作为数据框构造函数)?现在| 很难复制,而且您没有提供变量。

标签: python python-3.x pandas dataframe


【解决方案1】:

第一步是确保col_ref是每个DataFrame的索引,以使其余的操作更容易。如果还不是这样,那么:

df_func = df_func.set_index('col_ref')
df_val = df_val.set_index('col_ref')

然后,我们需要向 pandas 表明我们的意思是逐行减去 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

附录

在 cmets 中,OP 提到 df_func 中可能存在重复的 col_ref 值。在这种情况下,可以应用以下逻辑:

# 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')

【讨论】:

  • 感谢您的回答!很好的解释,看起来很有效。我正在尝试将其应用到我的场景中,但在“diff = df_func.subtract(df_val.squeeze(), axis=0)”中,数据帧差异具有列“index、col_ref、value、value1、value2、value3、value4”其中“索引”是从 0 开始的递增序列,col_ref 似乎正确,所有其他列都有 NaN。对可能发生的事情有任何想法吗?
  • 我明白了。让我修改你的问题(我修改为明确地将 col_ref 设为索引)和我的答案......
  • 好的,完成.......
  • 是的。逻辑不清楚是否有重复值col_ref——应该怎么办?
  • 不客气;另请参阅我修改后的答案中的附录。
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多