Python 基于熊猫中的其他数据帧过滤一个数据帧

Python 基于熊猫中的其他数据帧过滤一个数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我在熊猫中有两个数据帧: import pandas as pd df1 = pd.DataFrame({'Name': ["A", "B", "C", "C","D","D","E"], 'start': [50, 124, 1, 159, 12, 26,110], 'stop': [60, 200, 19, 200, 24, 30,160]}) df2 = pd.DataFrame({'Name': ["B", "

我在熊猫中有两个数据帧:

import pandas as pd

df1 = pd.DataFrame({'Name': ["A", "B", "C", "C","D","D","E"],
                   'start': [50, 124, 1, 159, 12, 26,110],
                   'stop': [60, 200, 19, 200, 24, 30,160]})
df2 = pd.DataFrame({'Name': ["B", "C","D","E"],
                   'start': [126, 143, 19, 159],
                   'stop': [129, 220, 27, 200]})

print(df1)

  Name  start  stop
0    A     50    60
1    B    124   200
2    C      1    19
3    C    159   200
4    D     12    24
5    D     26    30
6    E    110   160

print(df2)

  Name  start  stop
0    B    126   129
1    C    143   220
2    D     19    27
3    E    159   200
我希望使用以下条件筛选df1以基于df2删除行:

名称应同时出现在df1和df2中 名称从开始到停止的范围与另一个数据帧中该名称从开始到停止的范围重叠 这将使:

  Name  start  stop
0    B    124   200
1    C    159   200
2    D     12    24
3    D     26    30
4    E    110   160
其中:

A已删除,因为df2中没有A 保持B,因为df2中B的开始和停止嵌套在df1中B的开始和停止中 df1的一个C被删除,因为其值与df2不重叠,而另一个被保留,因为它嵌套在df2中C的开始和停止范围内 保留两个D,因为它们都与df2中的D范围重叠 在df2中,E的范围与E重叠,因此保持E
任何帮助都将不胜感激

对于任何感兴趣的人,我想出了一个方法

df3=[]
for index1, row1 in df1.iterrows():
    for index2, row2 in df2.iterrows():
        if row1["Name"] == row2["Name"]:
            x = range(row1["start"],row1["stop"])
            x = set(x)
            y = range(row2["start"],row2["stop"])
            if len(x.intersection(y)) > 0:
                df3.append(row1)
df3 = pd.DataFrame(df3).reset_index(drop=True)
print(df3)

  Name  start  stop
0    B    124   200
1    C    159   200
2    D     12    24
3    D     26    30
4    E    110   160
完成工作,尽管有点笨拙


如果有人能建议一种不那么麻烦的方式,我会很感兴趣的

为了解决您的问题,我应用了一种类似SQL的方法,模拟了以下查询:

选择 df.Name,df.start\u x作为开始,df.stop\u x作为停止 从…起 选择 df1.Name,df1.start作为start\u x,df1.stop作为stop\u x, df2.启动为开始,df2.停止为停止 来自df1 内连接df2 在df1.Name=df2.Name上 AS df 其中df.stop\u y>=df.start\u x和df.stop\u x>=df.start\u y 此查询已转换为使用该方法的以下代码片段。请注意,表达式df.stop\u y>=df.start\u x&df.stop\u x>=df.start\u y中必须使用括号。如果没有它们,代码将抛出异常

ValueError:序列的真值不明确。使用a.empty、a.bool、a.item、a.any或a.all

作为pd进口熊猫 df1=pd.DataFrame{'Name':[A,B,C,C,D,D,E], “开始”:[50124,1159,1226110], “停止”:[60200,19200,2430160]} df2=pd.DataFrame{'Name':[B,C,D,E], “开始”:[12614319159], “停止”:[12922027200]} df=pd.mergedf1,df2,on=['Name'] df=df[df.stop\u y>=df.start\u x&df.stop\u x>=df.start\u y] df.renamecolumns={'start_x':'start','stop_x':'stop'},inplace=True df.drop['start_y'、'stop_y'],轴=1,原地=True df.reset_indexdrop=True,inplace=True printdf 输出:

演示

  Name  start  stop
0    B    124   200
1    C    159   200
2    D     12    24
3    D     26    30
4    E    110   160