Python数据帧检查列数据帧中的值是否在另一个数据帧中报告的值的范围内

2024-01-03

如果问题微不足道,我深表歉意,但作为一个Python新手,我无法找到正确的解决方案。

我有两个数据帧,我需要向第一个数据帧添加一列,如果第一个数据帧的某个值位于第二个数据帧的两个值之间,则该列为 true,否则为 false。

例如:

first_df = pd.DataFrame({'code1':[1,1,2,2,3,1,1],'code2':[10,22,15,15,7,130,2]})
second_df = pd.DataFrame({'code1':[1,1,2,2,3,1,1],'code2_start':[5,20,11,11,5,110,220],'code2_end':[15,25,20,20,10,120,230]})

first_df

  code1 code2
0   1   10
1   1   22
2   2   15
3   2   15
4   3   7
5   1   130
6   1   2

second_df

  code1 code2_end   code2_start
0   1   15          5
1   1   25          20
2   2   20          11
3   2   20          11
4   3   10          5
5   1   120         110
6   1   230         220

对于第一个数据帧中的每一行,我应该检查 code2 列中报告的值是否位于第二个数据帧 secondary_df 的行标识的可能范围之一之间,例如:

在第 1 行first_df code1=1 and code2=22

检查second_df我有 4 行code1=1, rows 0,1,5 and 6, 价值code2=22位于由 确定的区间内code2_start=20 and code2_end=25所以函数应该返回True.

考虑一个函数应返回 False 的示例,

在第 5 行first_df code1=1 and code2=130

但不存在包含 130 的区间,其中code1=1

我尝试过使用这个功能

def check(first_df,second_df):
    for i in range(len(first_df):
        return ((second_df.code2_start <= first_df.code2[i]) & (second_df.code2_end <= first_df.code2[i]) & (second_df.code1 == first_df.code1[i])).any()

并将其向量化

first_df['output'] = np.vectorize(check)(first_df, second_df)

但显然没有成功。

我很高兴您能提供任何意见。

thx.

A.

作为一个实际的例子:

first_df.code1[0] = 1

因此我需要搜索所有实例中的第二个

second_df.code1 == first_df.code1[0]
0     True
1     True
2    False
3    False
4    False
5     True
6     True

对于状态为 True 的实例 0、1、5、6,我需要检查该值是否

first_df.code2[0]
10

介于由确定的范围之一之间

second_df[second_df.code1 == first_df.code1[0]][['code2_start','code2_end']]
    code2_start code2_end
0   5           15
1   20          25
5   110         120
6   220         230

由于first_df.code2[0]的值是10,它在5到15之间,所以第0行标识的范围因此我的函数应该返回True。在first_df.code1[6]的情况下,值仍然是1,因此范围表仍然与上面相同,但是first_df.code2[6]在这种情况下是2,并且没有包含2的区间,因此结果应该是False 。


first_df['output'] = (second_df.code2_start <= first_df.code2) & (second_df.code2_end <= first_df.code2)

这是有效的,因为当你做类似的事情时:second_df.code2_start <= first_df.code2

你会得到一个布尔系列。如果您对这些布尔系列中的两个执行逻辑与,您将得到一个具有值的系列True两个系列都在哪里True and False否则。

这是一个例子:

>>> import pandas as pd
>>> a = pd.DataFrame([{1:2,2:4,3:6},{1:3,2:6,3:9},{1:4,2:8,3:10}])
>>> a['output'] = (a[2] <= a[3]) & (a[2] >= a[1])
>>> a
   1  2   3 output
0  2  4   6   True
1  3  6   9   True
2  4  8  10   True

EDIT:

因此,根据您更新的问题和我对问题的新解释,我会这样做:

import pandas as pd

# Define some data to work with
df_1 = pd.DataFrame([{'c1':1,'c2':5},{'c1':1,'c2':10},{'c1':1,'c2':20},{'c1':2,'c2':8}])
df_2 = pd.DataFrame([{'c1':1,'start':3,'end':6},{'c1':1,'start':7,'end':15},{'c1':2,'start':5,'end':15}])

# Function checks if c2 value is within any range matching c1 value
def checkRange(x, code_range):
    idx = code_range.c1 == x.c1
    code_range = code_range.loc[idx]
    check = (code_range.start <= x.c2) & (code_range.end >= x.c2)
    return check.any()

# Apply the checkRange function to each row of the DataFrame
df_1['output'] = df_1.apply(lambda x: checkRange(x, df_2), axis=1)

我在这里所做的是定义一个名为的函数checkRange作为输入x,单行df_1 and code_range, 整个df_2数据框。它首先找到的行code_range具有相同的c1值作为给定行,x.c1。然后丢弃不匹配的行。这是在前两行中完成的:

idx = code_range.c1 == x.c1
code_range = code_range.loc[idx]

接下来,我们得到一个布尔系列,它告诉我们是否x.c2落在减少的任何范围内code_range数据框:

check = (code_range.start <= x.c2) & (code_range.end >= x.c2)

最后,由于我们只关心x.c2落在某个范围内,我们返回的值check.any()。当我们打电话时any()在布尔系列上,它将返回True如果系列中的任何值是True.

要致电checkRange每一行上的函数df_1, 我们可以用apply()。我定义一个拉姆达表达式 https://docs.python.org/2/tutorial/controlflow.html#lambda-expressions为了发送checkRange函数行以及df_2. axis=1意味着将在 DataFrame 的每一行(而不是每一列)上调用该函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python数据帧检查列数据帧中的值是否在另一个数据帧中报告的值的范围内 的相关文章

随机推荐

  • 标准形式 matplotlib -- 将 e 更改为 \times 10

    在 matplotlib 中 轴有时以标准形式显示 数字由刻度显示 类似 1e 7 的内容由轴显示 有没有办法将其更改为写出的 times 10 7 我不想更改每个刻度上的标签 我希望更改出现在轴底部的 1e 7 文本 最简单的答案 使用乳
  • 如何验证或验证 JWT 签名?

    我正在尝试在 Java 中验证 JWT 令牌 如何验证或验证 JWT 令牌的 JWT 签名 您可以使用 Spring Security 中的 JWT 库 网址为https github com spring projects spring
  • Android 短信发送状态

    我需要在我的 Android 应用程序中实现一个功能来发送短信 我找到了许多与此相关的教程 但无法获得交付状态 失败或正常 以下是我的短信方法 private void sendSmsMessageWithStatus String pho
  • SWT Shell 根据子项调整大小

    我正在研究这个Composite画布上还有其他Composite可以添加和删除 我对整个布局概念的理解仍然很模糊 当孩子被添加到容器中时 考虑到容器有一个GridData它填充了父级 父级不应该也知道子级调整了大小吗 由于外壳 顶部父级 的
  • Google 可视化 API 示例中的“无效 JSON 字符串”

    我大致如下这个例子 http code google com apis chart interactive docs dev gviz api lib html tojsonexample 但一定是在做一些愚蠢的事情 服务器端Django视
  • C# winform 应用程序未获取 Machine.Config 中的 maxTimeout 值

    我一直在开发一个带有 Oracle 10g 数据库的 winform 应用程序 该应用程序正在使用TransactionScope并想修改maxTimeOut指定的值机器配置文件 我的机器配置文件位于以下位置 我为此应用程序使用 net 4
  • 改进 malloc() 算法的下一步是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我自己写的简单malloc 函数 我想创建更快 更高效的变体 我编写的函数使用线性搜索并在内存中顺序连续分配 改进该算法的下一步是什么
  • 如何保存拟合的 R 模型以供以后使用

    很抱歉这个新手问题 如果我适合lm 型号或loess 模型 并将模型保存在文件或数据库中的某个位置 以供第三方以后使用predict 方法 我是否必须保存整个模型对象 由于返回的模型对象包含原始的原始数据 因此返回的对象可能会很大 如果您包
  • 使用 POI 在 Excel 中设置时间

    我正在尝试使用 Java 中的 POI api 创建 Excel 工作表 在该 Excel 工作表中 我想要一个仅包含 TIME 的单元格 通过设置此值 我们可以将单元格包含在该特定列的求和中 就像我们在数字列中所做的那样 为此 我们需要将
  • Java/XSD 解析

    我怀疑是否有这样的事情 但我想问一下 有谁知道Java中是否有一个库可以读取xsd文件并 创建 定义的元素 例如以字符串格式在代码中使用 例如 阅读以下架构
  • 是什么让 Mersenne Twister Tempering 功能可逆?

    众所周知 MT回火功能是可以逆转的 可以在线获取源代码来执行此操作here http b10l com p 24 我试图弄清楚这是如何工作的 以及如何以编程方式解决这个问题和类似的问题 我正在努力解决的是 对有限大小的变量进行移位操作会导致
  • 计算 pandas 数据框中连续正值的有效方法

    我试图计算 pandas 数据框中每列的连续积极事件的数量 这里DSM提供的解决方案 计算Python数组中的连续正值 https stackoverflow com questions 27626542 counting consecut
  • 名为 X 的 EntityManager 没有持久性提供程序

    我正在使用 JPA 开发 JavaSE 应用程序 不幸的是 我得到null致电后 Persistence createEntityManagerFactory PERSISTENCE UNIT NAME 下面你会发现 我的代码片段调用Ent
  • 平移动画后按钮未响应单击事件

    我已经在按钮上执行了翻译动画 一切都按我的预期工作 但唯一的问题是动画之后按钮没有响应单击事件 请纠正我 Button b Button findViewById R id button1 TranslateAnimation slide
  • 像这样使用 EF 将多个查询聚合为一个查询吗?

    我在我的应用程序中使用 EF 4 0 POCO 像这样检索信息有什么缺点吗 Given a customerId and a productId 我想应用一些业务规则 要求我从需要多次查询的数据库中获取大量微小的信息 相反 我可以编写一个查
  • 从 main “返回”的正确方法

    假设我们有这样的程序 int main int argc char argv if argc lt 3 printf usage details n return EXIT FAILURE dostuff return EXIT SUCCE
  • 如何仅从 DateTime 获取小时和分钟

    我可以说 2015 01 16 13 50 00 000 在我的数据库中 如何仅获取小时和分钟 13 50 最后我想像这样进行查询 更新 A 设置状态 1 WHERE endTime current time endTime 我上面示例的字
  • angular2 - 在组件之间传递数据对象

    如果可能的话 寻求一些帮助 我有一个位于一个组件中的数据对象 该数据对象是从 REST 调用接收到的 它包含我想跨组件共享的用户详细信息 但我遇到了麻烦 将此对象传递给另一个组件以便我可以使用详细信息的最佳方法是什么 前任 数据对象名为 u
  • 从序列化数据创建数字人物指纹模板

    这是一个非常具体的问题 可能会让我获得风滚草徽章 但如果可以的话请回答 我已经将 DigitalPersona sdk dll 作为类型库导入到 Delphi 中 并尝试验证我作为序列化数据存储在数据库中的指纹 它工作得非常好 注册似乎工作
  • Python数据帧检查列数据帧中的值是否在另一个数据帧中报告的值的范围内

    如果问题微不足道 我深表歉意 但作为一个Python新手 我无法找到正确的解决方案 我有两个数据帧 我需要向第一个数据帧添加一列 如果第一个数据帧的某个值位于第二个数据帧的两个值之间 则该列为 true 否则为 false 例如 first