首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在最大偏差范围内比较两种熊猫数据的值

在最大偏差范围内比较两种熊猫数据的值
EN

Stack Overflow用户
提问于 2021-12-26 13:27:31
回答 1查看 71关注 0票数 0

我有两只熊猫的资料:

代码语言:javascript
复制
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中每列允许的最大偏差。

例如,例如:

代码语言:javascript
复制
max_deviation_value1 = 1.5
max_deviation_value2 = 2
max_deviation_value3 = 4
max_deviation_value4 = 2.3

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-26 14:22:08

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

代码语言:javascript
复制
df_func = df_func.set_index('col_ref')
df_val = df_val.set_index('col_ref')

然后,我们需要向熊猫指出,我们的意思是按行减去df_val's 'value' (从value{i}的每一列中):

代码语言:javascript
复制
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值:最简单的方法是将它们放在一个系列中。例如:

代码语言:javascript
复制
max_deviation = pd.Series(dict(
    value1=1.5,
    value2=2.0,
    value3=4.0,
    value4=2.3,
))

然后,这个比较实际上是这样写的:

代码语言:javascript
复制
>>> 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值。在这种情况下,可以应用以下逻辑:

代码语言:javascript
复制
# 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`行:

代码语言:javascript
复制
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的重复条目,那么我们可以去重复(例如,取第一个条目):

代码语言:javascript
复制
# 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')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70486810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档