我有 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
然后您可以轻松打印 Region
和 ID
,例如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/