【问题标题】:python pandas check value comming under range in another dataframepython pandas检查值在另一个数据框中的范围内
【发布时间】:2020-05-30 13:58:18
【问题描述】:

我的第一个数据帧

dataframe1=

id   number  count1 count2  
1   5225    10       30 
2   2222    3        40
3   7121    30        50

第二个数据帧

dataframe2=

id  value1  value2 
1   4000     6000
3   2500     3300
3   7000     8000

输出

id  value1  value2 number count1 count2
1   4000     6000  5225  10       30
3   7000     8000  7121  30       50

我试过了

dataframe2['a']=(dataframe1['number']>= dataframe2['value1']) & (dataframe1['number'] <= dataframe2['value2'])

它在a列中给出了True False值,我想做的是:对于Dataframe1“数字”列中的每个值,搜索它是否等于或介于“value1”和“value2”对中的任何一个Dataframe2 的值。此外,对于这个“number1”和“number2”对值,其各自的“id”必须与 Dataframe 中的“id”匹配。如果这都是真的,那么我想在 dataframe2 中插入 number、count1 和 count2

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:
    merged = df1.join(df2, on="id", how="inner")
    result = merged.query("value1 <= number <= value2")
    result
    
        number  count1  count2  value1  value2
    id                                        
    1     5225      10      30    4000    6000
    3     7121      30      50    7000    8000
    

    【讨论】:

    • 感谢您的ansr mboss,没有加入id我们可以吗?假设没有 ID 列
    【解决方案2】:

    首先,让我们根据您的示例创建数据框:

    数据帧 1

    import pandas as pd  
    
    d1 = {'id': [1, 2, 3],
         'number': [5225, 2222, 7121],
         'count1': [10, 3, 30],
         'count2': [30, 40, 50]}
    df1 = pd.DataFrame(data = d1)
    print(df1)
    
    id  number  count1  count2
    1   5225    10      30
    2   2222    3       40
    3   7121    30      50
    

    数据帧 2

    d2 = {'id': [1, 3, 3],
         'value1': [4000, 2500, 7000],
         'value2': [6000, 3300, 8000]}
    df2 = pd.DataFrame(data = d2)
    print(df2)
    
    id  value1  value2
    1   4000    6000
    3   2500    3300
    3   7000    8000
    

    一种可能的解决方案是首先将两个表连接在一起:

    df3 = df1.join(other = df2.set_index('id'),
                  on = 'id')
    print(df3)
    
    id  number  count1  count2  value1  value2
    1   5225    10      30      4000.0  6000.0
    2   2222    3       40      NaN     NaN
    3   7121    30      50      2500.0  3300.0
    3   7121    30      50      7000.0  8000.0
    

    然后按多个条件过滤:

    df3[(df3['number'] >= df3['value1']) & (df3['number'] <= df3['value2'])]
    
    
    id  number  count1  count2  value1  value2
    1   5225    10      30      4000.0  6000.0
    3   7121    30      50      7000.0  8000.0
    

    【讨论】:

    • 谢谢 Josiah,做得很好.. 谢谢你的回答
    • 嗨 Josaih,如果没有加入 ID,我们可以这样做吗
    • 在 value1(2500) 和 value2(3300) 下还有一个值 2222 我也想要那个类型的值
    • 您可以在不加入 ID 的情况下加入,但是,输出与您想要的结果不同。对于数字 5225 和 7121,您将拥有 ID value1 和 value2 将导致 NaN。
    • 添加值 2222,value1 为 2500,value2 为 3300:d2 = {'id': [1, 3, 3, 2], 'value1': [4000, 2500, 7000, 2500 ], 'value2': [6000, 3300, 8000, 3300]}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多