我有两个数据集(df1
和df2
)的值,它们都有一定的范围(Start
和End
)
我想用df2
上对应的重叠值范围(Start
/End
)的Num
列中的值来注释第一个(df1
)
示例:df1
中的第一行范围为0
-2300000
,由于2300000
低于df2
中第一行的End
,并且整个范围0
-2300000
与62920
-121705338
的范围重叠,因此将用^{df1
的范围2300000
-5400000
与第2行62920
-121705338
的范围重叠,第2行也将被注释为Num
{
但是,对于df1
的最后一行,范围包含df2
中的两行,因此需要在df2
的最后两行Num
中输出和
所需的输出将是df3
df1.head()
|Start |End |Tag |
|---------|---------|-------|
|0 |2300000 |gneg45 |
|2300000 |5400000 |gpos25 |
|143541857|200000000|gneg34 |
df2.head()
| Start | End | Num |
|---------|---------|--------|
|62920 |121705338| 3 |
|143541857|147901334| 2 |
|147901760|151020217| 5 |
df3 =
|Start |End |Num |
|---------|---------|-------|
|0 |2300000 |3 |
|2300000 |5400000 |3 |
|143541857|200000000|7 |
我试图创建一个键,并基于一系列列创建一个键,但没有任何效果
提前谢谢
根据您的描述,您正在查找
df1
和df2
中的重叠范围,以便df1
从df2
中获取Num
值为了制定重叠范围条件的条件,让我们如下说明非重叠范围的相反条件:
要么:
或:
该非重叠范围条件可表述为:
(
df1.End
<;df2.Start
)或(df1.Start
>;df2.End
)因此,重叠范围条件,作为相反的,是上述条件的否定,即:
(
df1.End
<;df2.Start
)|(df1.Start
>;df2.End
))这相当于:
(
df1.End
>;=df2.Start
)及;(df1.Start
<;=df2.End
)[注:我们通过考虑对立面来推导重叠条件并得到否定,因为重叠条件有更多的场景。有4种情况:(1)
df1
覆盖整个df2
范围和更多;(2)df1
完全包含在df2
范围内;(3)仅在左端重叠;(4)仅在右端重叠。我们可以通过我们的方法简化逻辑。]解决方案1:小数据集的简单解决方案
步骤1:对于小数据集,您可以通过^{} 交叉连接} 按重叠条件过滤,如下所示:
df1
和df2
,然后使用^{如果您的Pandas版本早于1.2.0(于2020年12月发布),并且不支持与
how='cross'
合并,则可以使用:中间结果:
第2步:通过{a3}和{a4}对相同范围(相同{}和{})的{}值求和:
结果:
解决方案2:大数据集的Numpy解决方案
对于大型数据集和性能问题,您可以使用numpy broadcasting(而不是交叉连接和筛选)来加快执行时间:
第1步:
中间结果:
第2步:通过{a3}和{a4}对相同范围(相同{}和{})的{}值求和:
结果:
相关问题 更多 >
编程相关推荐