在最大范围内过滤

2024-10-05 14:21:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究文本挖掘问题,并使用Pandas进行文本处理。从下面的示例中,我只需要选择那些在同一类别(cat)中具有最大跨度(start-end)的行

给定此数据帧:

                             name  start  end        cat
0                        coumadin      0    8       DRUG
1                       albuterol     18   27       DRUG
2               albuterol sulfate     18   35       DRUG
3                         sulfate     28   35       DRUG
4                             2.5     36   39   STRENGTH
5                          2.5 mg     36   42   STRENGTH
6                    2.5 mg /3 ml     36   48   STRENGTH
7                           0.083     50   55   STRENGTH
8                         0.083 %     50   57   STRENGTH
9          2.5 mg /3 ml (0.083 %)     36   58   STRENGTH
10                       solution     59   67       FORM
11      solution for nebulization     59   84       FORM
12                   nebulization     72   84      ROUTE
13                        one (1)     90   97  FREQUENCY
14                            neb     98  101      ROUTE
15                 neb inhalation     98  112      ROUTE
16                     inhalation    102  112      ROUTE
17                            q4h    113  116  FREQUENCY
18                          every    118  123  FREQUENCY
19                  every 4 hours    118  131  FREQUENCY
20            q4h (every 4 hours)    113  132  FREQUENCY
21  q4h (every 4 hours) as needed    113  142  FREQUENCY
22                      as needed    133  142  FREQUENCY
23                        dyspnea    147  154     REASON

我需要得到以下信息:

            name           start   end       cat
0                coumadin      0    8       DRUG
2   albuterol sulfate         18    35      DRUG
9   2.5 mg /3 ml (0.083 %)    36    58  STRENGTH
11  solution for nebulization 59    84      FORM
13                one (1)     90    97  FREQUENCY
15  neb inhalation            98    112    ROUTE
21  q4h (every 4 hours) as needed   113 142 FREQUENCY
23  dyspnea                  147    154   REASON

我尝试的是按类别groupby,然后计算最大差值(end-start)。然而,我被困在如何找到最大跨度为同一实体之间的类别。我想这应该不是很棘手

评论

谢谢大家的建议,但我需要在每个类别内的所有可能的实体。例如,在药物中,有两种相关的药物:coumadinalbuterol sulfate,以及它们的一些部分(albuterolsulfate)。我只需要删除(albuterolsulfate),同时保留coumadinalbuterol sulfate。其他类别的逻辑相同。你知道吗

例如,行4-8都是完整行9的位,因此我只需要保留行9。行1和3是行2的一部分,因此我需要保留行2(除了行0之外)。等等

显然,所有的组成部分(“位”)都在max范围内,但问题是要找到同一实体及其组成部分的max(或统一范围)

评论2

一个可能的解决方案是:在同一个类别cat中找到所有重叠的区间,然后选择最大的区间。我正在努力实现,但到目前为止运气不好。你知道吗

可能的解决方案

我按升序和降序对列进行排序:

你知道吗df.sort\u值(按=[1,2],升序=[True,False])

                           0           1     2     3
0   coumadin                           0     8  DRUG
2   albuterol sulfate                 18    35  DRUG
1   albuterol                         18    27  DRUG
3   sulfate                           28    35  DRUG
9   2.5 mg /3 ml (0.083 %)            36    58  STRENGTH
6   2.5 mg /3 ml                      36    48  STRENGTH
5   2.5 mg                            36    42  STRENGTH
4   2.5                               36    39  STRENGTH
8   0.083 %                           50    57  STRENGTH
7   0.083                             50    55  STRENGTH
11  solution for nebulization         59    84  FORM
10  solution                          59    67  FORM
12  nebulization                      72    84  ROUTE
13  one (1)                           90    97  FREQUENCY
15  neb inhalation                    98    112 ROUTE
14  neb                               98    101 ROUTE
16  inhalation                       102    112 ROUTE
21  q4h (every 4 hours) as needed    113    142 FREQUENCY
20  q4h (every 4 hours)              113    132 FREQUENCY
17  q4h                              113    116 FREQUENCY
19  every 4 hours                    118    131 FREQUENCY
18  every                            118    123 FREQUENCY
22  as needed                        133    142 FREQUENCY
23  dyspnea                          147    154 REASON

它将相关行放在第一位,但是,我仍然需要过滤掉不相关的行。。。。你知道吗


Tags: form类别routemlstrengthsolutionfrequencyevery
1条回答
网友
1楼 · 发布于 2024-10-05 14:21:49

我在你的df样品上试过这个:

创建示例数据框:

import pandas as pd 
Name = ['coumadin','albuterol','albuterol sulfate','sulfate']
Cat = ['D', 'D', 'D', 'D']
Start = [0, 18, 18, 28]
End = [8, 27, 33,35]
ID = [1,2,3,4]
df = pd.DataFrame(data = list(zip(ID,Name,Start,End,Cat)), \
                  columns=['ID','Name','Start','End','Cat'])

做一个有助于识别相似名字的函数

def matcher(x):
    res = df.loc[df['Name'].str.contains(x, regex=False, case=False), 'ID']
    return ','.join(res.astype(str))

将此函数应用于列的值

df['Matches'] = df['Name'].apply(matcher) ##Matches will contain the ID of rows which are similar and have only 1 value which are absolute.

       ID               Name  Start  End Cat Matches
    0   1           coumadin      0    8   D       1
    1   2          albuterol     18   27   D     2,3
    2   3  albuterol sulfate     18   33   D       3
    3   4            sulfate     28   35   D     3,4 

计算进入匹配项的行数

df['Count'] = df.Matches.apply(lambda x: len(x.split(',')))

将“Count”为1的df保留为包含其他行的行:

df = df[df.Count == 1]

ID               Name  Start  End Cat Matches  Count
0   1           coumadin      0    8   D       1      1
2   3  albuterol sulfate     18   33   D       3      1

然后可以删除不必要的列:)

相关问题 更多 >