Python 3.x Python和Pandas,查找包含值的行,目标列有多组范围

Python 3.x Python和Pandas,查找包含值的行,目标列有多组范围,python-3.x,pandas,range,Python 3.x,Pandas,Range,我有一个凌乱的数据框,试图在ids列中“标记”包含某个数字的行。此列中的值表示包含的范围:例如,“第4行”包含以下数字: 240924102411241324142377237814781479148014811488214831484在“第0行”和“第1行”中,其中一组的范围是向后的(193119301929) 例如,如果我想知道哪些行具有包含“2340”和“1930”的集合,我将如何做到这一点?我认为需要一个循环,有时需要查询两个以上的数字。使用Python3.8 示例数据帧 x = ['1

我有一个凌乱的数据框,试图在
ids
列中“标记”包含某个数字的行。此列中的值表示包含的范围:例如,“第4行”包含以下数字: 240924102411241324142377237814781479148014811488214831484
在“第0行”和“第1行”中,其中一组的范围是向后的(193119301929)

例如,如果我想知道哪些行具有包含“2340”和“1930”的集合,我将如何做到这一点?我认为需要一个循环,有时需要查询两个以上的数字。使用Python3.8

示例数据帧

x = ['1331:1332,1552:1551,1931:1928,1965:1973,1831:1811,1927:1920',
     '1331:1332,1552:1551,1931:1929,180:178,1966:1973,1831:1811,1927:1920',
     '2340:2341,1142:1143,1594:1593,1597:1596,1310,1311',
     '2339:2341,1142:1143,1594:1593,1597:1596,1310:1318,1977:1974',
     '2409:2414,2377:2378,1478:1484',
     '2474:2476',
]
y = [6.48,7.02,7.02,6.55,5.99,6.39,]
df = pd.DataFrame(list(zip(x, y)), columns =['ids', 'val']) 
display(df)

所需的输出数据帧

我将编写一个执行两个步骤的函数:

  • 给定包含ID范围的ID字符串,将所有ID列为
    ids\u num\u list
  • 检查
    query\u id
    是否在
    ids\u num\u列表中
  • 这将返回您所需的内容:

        ids                                                 val     n2340   n1930
    0   1331:1332,1552:1551,1931:1928,1965:1973,1831:1...   6.48    0       1
    1   1331:1332,1552:1551,1931:1929,180:178,1966:197...   7.02    0       1
    2   2340:2341,1142:1143,1594:1593,1597:1596,1310,1311   7.02    1       0
    3   2339:2341,1142:1143,1594:1593,1597:1596,1310:1...   6.55    1       0
    4   2409:2414,2377:2378,1478:1484                       5.99    0       0
    5   2474:2476                                           6.39    0       0
    
    

    我将编写一个执行两个步骤的函数:

  • 给定包含ID范围的ID字符串,将所有ID列为
    ids\u num\u list
  • 检查
    query\u id
    是否在
    ids\u num\u列表中
  • 这将返回您所需的内容:

        ids                                                 val     n2340   n1930
    0   1331:1332,1552:1551,1931:1928,1965:1973,1831:1...   6.48    0       1
    1   1331:1332,1552:1551,1931:1929,180:178,1966:197...   7.02    0       1
    2   2340:2341,1142:1143,1594:1593,1597:1596,1310,1311   7.02    1       0
    3   2339:2341,1142:1143,1594:1593,1597:1596,1310:1...   6.55    1       0
    4   2409:2414,2377:2378,1478:1484                       5.99    0       0
    5   2474:2476                                           6.39    0       0
    
    

    您可以使用apply或Values搜索每一行,您是在查找True还是False?如果找到这两个值,则为True?在此行中,您有
    '2340:2341142:11431594:15931597:159613101311',
    最后一个值的格式不同。这是正确的还是应该是一个
    您可以使用apply或values搜索每一行,您是在查找True还是False?如果找到这两个值,则为True?在此行中,您有
    '2340:2341142:11431594:15931597:159613101311',
    最后一个值的格式不同。这是正确的还是应该是
    而不是将其存储到列表中,您可以直接检查,如果找到,则返回。如果int(query_id)在范围(int(lower)、int(upper)+1)内,请尝试
    :返回1
    。else语句也是如此<代码>如果id\u range==query\u id:返回1。这样可以避免以后检查列表。当您退出for循环时,返回0而不是将其存储到列表中,您可以直接检查并在找到时返回。如果int(query_id)在范围(int(lower)、int(upper)+1)内,请尝试
    :返回1
    。else语句也是如此<代码>如果id\u range==query\u id:返回1。这样可以避免以后检查列表。退出for循环后,返回0