熊猫在最大范围内过滤

时间:2018-12-25 16:50:07

标签: python pandas

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

给出此数据框:

                             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)。但是我陷入了如何找到类别中同一实体之间的最大跨度的问题。我想这应该不是很棘手

评论

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

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

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

评论2

一个可能的解决方案是:找到同一类别cat中的所有重叠间隔并选择最大的间隔。我正在尝试实施,但到目前为止还算不上运气。

可能的解决方案

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

df.sort_values(by = [1,2],ascending = [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

将相关行放在第一位,但是,我仍然需要过滤掉不相关的行。...

1 个答案:

答案 0 :(得分:1)

我已经在您的df样本上尝试过此操作:

创建示例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

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