【问题标题】:Need to find if any combination of summed values between two series exceeds a threshold需要查找两个系列之间的总和值的任何组合是否超过阈值
【发布时间】:2019-08-26 22:29:11
【问题描述】:

我有几个具有分值的数据框。我需要找出总分值的任何组合是否超过阈值。

import pandas as pd

df1 = pd.DataFrame([
    {'Node': 'A', 'Score': 1},
    {'Node': 'B', 'Score': 2},
    {'Node': 'C', 'Score': 3},
])

df2 = pd.DataFrame([
    {'Node': 'D', 'Score': 4},
    {'Node': 'E', 'Score': 5},
    {'Node': 'F', 'Score': 6},
])

df3 = pd.DataFrame([
    {'Node': 'G', 'Score': 7},
    {'Node': 'H', 'Score': 8},
    {'Node': 'I', 'Score': 9},
])

我需要检查是否 A 分数 + D 分数 > 阈值,A 分数 + E 分数 > 阈值,...,C 分数 + F 分数 > 阈值。

这将获得两个数据帧之间超过阈值的组合数。有没有一种有效的方法来扩展它以查找所有数据帧和大于 2 个数据帧的组合超过阈值的次数?

threshold = 10
s1 = df1['Score']
s2 = df2['Score']

s1.apply(lambda x: (x + s2) > threshold).values.sum()

如果在任何数据帧组合中超过阈值,则输出应为 True。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这就是所谓的 sql 中的交叉连接,在这里我们可以用pandasmerge 来实现它

    threshold = 10
    df1.assign(key=1).merge(df2.assign(key=1),on='key').eval('Score_x+Score_y>@threshold').sum()
    

    如果超过两个:也请与reduce merge联系

    df1.assign(key=1).merge(df2.assign(key=1),on='key').merge(df3.assign(key=1),on='key').eval('Score_x+Score_y+Score>@threshold').sum()
    

    【讨论】:

      【解决方案2】:

      因此,如果您只是在寻找 True 或 False 返回,那么您可以对 Dataframe 的最大值求和,并确定这是否超过了您的阈值。也就是说,

      from itertools import combinations
      
      
      def check_thr(threshold, *dfs):
          for df1, df2 in combinations(dfs, 2):
              if sum(df1['Score'].values.max(), df2['Score'].values.max()) > thr:
                  return True
          return False
      
      

      combinations(..., 2) 从您的数据帧序列中获取所有大小为 2 的组合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 2021-02-25
        相关资源
        最近更新 更多