我正在研究文本挖掘问题,并使用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中,有两种相关的药物:coumadin
和albuterol sulfate
,以及其中的一部分(albuterol
和sulfate
)。我只需要删除(albuterol
和sulfate
,同时保留coumadin
和albuterol 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
将相关行放在第一位,但是,我仍然需要过滤掉不相关的行。...
答案 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
然后您可以删除不必要的列:)