python - 如何检查一个数据帧的范围是否在另一个数据帧的范围内

标签 python python-3.x pandas dataframe

我有 2 个数据帧,我想检查 DF1 中的开始、结束范围是否在 DF2 中的开始、结束范围内,对于真实的我想打印 ID 和区域。我想将 DF1 的每一行与 DF2 的每一行进行比较。
这些是我的数据框:

DF1 = pd.DataFrame ({'Start':[500, 850, 1000],
                    'End':[700, 950, 1200],
                    'Region':["A", "B", "C"]})

DF2 = pd.DataFrame ({'Start':[200, 800, 1100],
                    'End':[750, 950, 1250],
                    'ID':[1, 2, 3]})
DF1


开始
结尾
地区


500
700
一种

850
950


1000
1200
C

1100
1500
D


DF2


开始
结尾
ID


200
750
1

800
950
2

1100
1250
3


我假设我必须编写一个 for 循环来遍历所有行。但是,我是初学者,我很难正确设置它。
这是我迄今为止尝试过的代码。
for Start, End in DF1:
    if Start>=DF2["Start"] and End<=DF2["End"]:
      print (DF1["Region"], DF2["ID"])
但是,我收到此错误:ValueError:要解压缩的值太多(预期为 2)
任何有关如何解决此问题的建议将不胜感激。

最佳答案

您可以通过 .merge() 交叉连接 2 个数据框然后使用 .query() 过滤具有所需条件的行,如下所示:

DF_out = DF1.merge(DF2, how='cross').query('(Start_x >= Start_y) & (End_x <= End_y)')
如果您的 Pandas 版本低于 1.2.0(2020 年 12 月版本)且不支持 how='cross' , 您可以使用:
DF_out = DF1.assign(key=1).merge(DF2.assign(key=1), on='key').drop('key', axis=1).query('(Start_x >= Start_y) & (End_x <= End_y)')
结果:Start_x , End_x都是原版Start , End DF1 中的列Start_y , End_y都是原版Start , End DF2 中的列
print(DF_out)

   Start_x  End_x Region  Start_y  End_y  ID
0      500    700      A      200    750   1
4      850    950      B      800    950   2
然后您可以轻松打印 RegionID ,例如
print(DF_out['Region'])

0    A
4    B
Name: Region, dtype: object



print(DF_out['ID'])

0    1
4    2
Name: ID, dtype: int64
如果您的检查标准严格<>而不是 <=>= ,可以修改.query()中的比较运算符符号, 如下:
DF_out = DF1.merge(DF2, how='cross').query('(Start_x > Start_y) & (End_x < End_y)')
结果:
print(DF_out)

   Start_x  End_x Region  Start_y  End_y  ID
0      500    700      A      200    750   1

关于python - 如何检查一个数据帧的范围是否在另一个数据帧的范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68773770/

相关文章:

python - 将 pandas.dataframe.pivot_table 与非数字、非唯一值一起使用

python - 属性错误: partially initialized module 'face_recognition' has no attribute 'face_encodings'

python - 如何从 tensorflow 高级 API 恢复训练好的 LinearClassifier 并进行预测

python - 根据列中的类别删除行

python-3.x - sagemaker 在反序列化时给出 UnicodeDecodeError

python - 列表/数组表示 [] 和 {} 有什么区别?

python - 使用 Timegrouper '1M' 按列进行分组和求和会弄乱我的日期索引 pandas python

python - bool 列上的条件 DataFrame 过滤器?

python - 如何从元组中间开始枚举

python - 将 Pandas 列转换为用户定义的周数