如何编写一个函数来减少Python Pandas中的重复代码

2024-09-30 06:17:13 发布

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

我试图从df['Text']系列中提取一个药物名称,如果df['Stem']中的后缀与药物名称的后缀匹配。在

print (df['Text'])

Text
1/1/11 (USA) neoadjuvant arimidex
1/2/11 radafaxine + cisplatin.
1/3/11 abc letrozole

print (df['Stem'])

Stem
dex 
zole
platin
axine
amivir
arit

期望输出为:

^{pr2}$

以下是我所做的提取和创造一个新的系列'毒品':

^{3}$

但是,它是重复的,我想创建一个函数,可以迭代'文本',匹配包含后缀的药物名称,并提取它。我想知道有没有熊猫的方式来做这件事。提前谢谢你。在

更新: 根据MaxU的建议,我创建了一个与原始数据相似的新数据帧。在

print (df['Text_Long'])

Text_Long
2/1/14 (JK) DOCETAXEL, PYPHAMIDE
2/10/14 (JK) NITROZOLE
2/12/14-4/15/14 30MV PHOTONS TO LT arm,  JC/WE 500JC IN 25OP
2/22/12 (Kansas/HEM)- NEOADJUVANT KITOTERE, DRYMYCIN, KITOXAN
4/11/11-11/24/11 (JK) CYCLOPHOSPHAMIDE, FLUOROURACIL
4/14/14  (CONN) GEMZAR + OPR.  11/25/14  (CONN) OPR.
4/12/12-10/2/12-KT-RIGHT ARM-5020 NYG, 24 PRESSURE
JK DRUG therapy: aritrozole
NITROZOLE STARTED ON 1/11/12 PER ADVICE
KFC X 2
maritinib & fosclitaxel.
Urioxifen
10/2/12 NEOADJUVANT FLOMIDEX
10/29/12 YUMYCIN, KITOXAN, TACXOL
11/11/14 (JK) GOODZOLE
2/12/12  (CONN)  petbine + pastlatin.
4/2014  (CONN)  Continue PSCORE for 2 cycles.
2/2015 to 5/2015 OSF (Stinson)  XRT
5/19/10-2/21/10 HEMYCIN AND BASKIXAN
5/2/12-5/12/12 1000NY/20FL/30MT/OT A2-A9
2/2015  OPC (JK)  DRUG THERAPY`print(stem)

以下是Github上包含后缀列表的excel文件: Link

再次感谢您的帮助和建议!在


Tags: text名称dfconn后缀建议long药物
1条回答
网友
1楼 · 发布于 2024-09-30 06:17:13

假设您有以下DF:

In [92]: drugs_stem
Out[93]:
     Stem
0     dex
1    zole
2  platin
3   axine
4  amivir
5    arit

以及:

^{pr2}$

您可以执行以下操作:

In [94]: pat = r'\b(\w*(?:{})\w*)\b'.format(drugs_suff.Stem.str.cat(sep='|'))

In [95]: df['Drugs'] = df.Text.str.extractall(pat, flags=re.I).unstack() \
                         .apply(lambda x:', '.join(x.dropna()), axis=1)

In [96]: df
Out[96]:
                                Text                  Drugs
0  1/1/11 (USA) neoadjuvant arimidex               arimidex
1     1/2/11 radafaxine + cisplatin.  radafaxine, cisplatin
2               1/3/11 abc letrozole              letrozole

更新:

In [25]: %paste
drugs_stem = pd.Series(suffix)
pat = r'\b(\w*(?:{})\w*)\b'.format(drugs_stem.str.cat(sep='|'))
df['Drugs'] = df.Text_Long.str.lower().str.extractall(pat).unstack() \
                .apply(lambda x:', '.join(x.dropna()), axis=1)
##   End pasted text  

In [26]: df
Out[26]:
                                            Text_Long                                Drugs
0                    2/1/14 (JK) DOCETAXEL, PYPHAMIDE                            docetaxel
1                              2/10/14 (JK) NITROZOLE                            nitrozole
2   2/12/14-4/15/14 30MV PHOTONS TO LT arm,  JC/WE...                                  NaN
3   2/22/12 (Kansas/HEM)- NEOADJUVANT KITOTERE, DR...                    drymycin, kitoxan
4   4/11/11-11/24/11 (JK) CYCLOPHOSPHAMIDE, FLUORO...                         fluorouracil
5   4/14/14  (CONN) GEMZAR + OPR.  11/25/14  (CONN...                           conn, conn
6   4/12/12-10/2/12-KT-RIGHT ARM-5020 NYG, 24 PRES...                                  NaN
7                         JK DRUG therapy: aritrozole                           aritrozole
8             NITROZOLE STARTED ON 1/11/12 PER ADVICE                   nitrozole, started
9                                             KFC X 2                                  NaN
10                           maritinib & fosclitaxel.               maritinib, fosclitaxel
11                                          Urioxifen                            urioxifen
12                       10/2/12 NEOADJUVANT FLOMIDEX                                  NaN
13                  10/29/12 YUMYCIN, KITOXAN, TACXOL             yumycin, kitoxan, tacxol
14                             11/11/14 (JK) GOODZOLE                                  NaN
15              2/12/12  (CONN)  petbine + pastlatin.                      conn, pastlatin
16      4/2014  (CONN)  Continue PSCORE for 2 cycles.  conn, continue, pscore, for, cycles
17                2/2015 to 5/2015 OSF (Stinson)  XRT                                  NaN
18               5/19/10-2/21/10 HEMYCIN AND BASKIXAN                              hemycin
19           5/2/12-5/12/12 1000NY/20FL/30MT/OT A2-A9                                  NaN
20                     2/2015  OPC (JK)  DRUG THERAPY                                  NaN

注意:此解决方案已使用Pandas 0.19.2进行了测试-您可能对Pandas版本<;0.19.0(a few bugs were fixed in ^{} function in Pandas 0.19.0)有问题

相关问题 更多 >

    热门问题