检查多列的条件并创建新列

2024-10-03 06:26:36 发布

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

我有以下数据帧

   text         ext_nms ext_dt  ext_cd  ext_addr
Stonetrust      CRR     xxx     xxx     xxx
Wilkes          CRR     xxx     xxx     xxx
wcv 0086967 05  xxx     xxx     COD     xxx
SILVER  INC     xxx     xxx     xxx     ADD
PO BOX 988      xxx     xxx     xxx     ADD
LA 70520        xxx     xxx     xxx     ADD
02/12/2019      xxx     DAT     xxx     ADD

我的预期产出:

text            ext_nms ext_dt  ext_cd  ext_addr    out
Stonetrust      CRR     xxx     xxx     xxx         CRR
Wilkes          CRR     xxx     xxx     xxx         CRR
wcv 0086967 05  xxx     xxx     COD     xxx         COD
SILVER  INC     xxx     xxx     xxx     ADD         ADD
PO BOX 988      xxx     xxx     xxx     ADD         ADD
LA 70520        xxx     xxx     xxx     ADD         ADD
02/12/2019      xxx     DAT     xxx     xxx         DAT

本质上,我想创建一个具有非xxx字符串的新列,该值需要移动到该新列

我尝试的是:

df['qs_key'] = df.filter(like='^ext').replace('^xxx', '').apply(lambda x: ''.join(x), axis=1)

我没有得到我想要的结果

任何帮助都将不胜感激。谢谢


Tags: textaddsilverdtcdextdatxxx
2条回答

IIUC使用df.ne("xxx")stackmap

   df["out"] = df["text"].map(df[df.ne("xxx")].set_index("text").stack().droplevel(1))
   
   print (df)
   
                text ext_nms ext_dt ext_cd ext_addr  out
   0      Stonetrust     CRR    xxx    xxx      xxx  CRR
   1          Wilkes     CRR    xxx    xxx      xxx  CRR
   2  wcv 0086967 05     xxx    xxx    COD      xxx  COD
   3      SILVER INC     xxx    xxx    xxx      ADD  ADD
   4      PO BOX 988     xxx    xxx    xxx      ADD  ADD
   5        LA 70520     xxx    xxx    xxx      ADD  ADD
   6      02/12/2019     xxx    DAT    xxx      xxx  DAT

在代码中,使用regex作为regex code的过滤器,然后添加regex=True作为子字符串替换,最后一个lambda应该省略:

df['qs_key'] = df.filter(regex='^ext').replace('^xxx', '', regex=True).apply(''.join, axis=1)
print (df)
             text ext_nms ext_dt ext_cd ext_addr qs_key
0      Stonetrust     CRR    xxx    xxx      xxx    CRR
1          Wilkes     CRR    xxx    xxx      xxx    CRR
2  wcv 0086967 05     xxx    xxx    COD      xxx    COD
3     SILVER  INC     xxx    xxx    xxx      ADD    ADD
4      PO BOX 988     xxx    xxx    xxx      ADD    ADD
5        LA 70520     xxx    xxx    xxx      ADD    ADD
6      02/12/2019     xxx    DAT    xxx      xxx    DAT

如果可能有多个值,需要首先将^xxx替换为缺少的值,然后重新填充缺少的值,最后按位置查看第一列:

df['qs_key'] = df.filter(regex='^ext').replace('^xxx', np.nan, regex=True).bfill(axis=1).iloc[:, 0]

print (df)
             text ext_nms ext_dt ext_cd ext_addr qs_key
0      Stonetrust     CRR    xxx    xxx      xxx    CRR
1          Wilkes     CRR    xxx    xxx      xxx    CRR
2  wcv 0086967 05     xxx    xxx    COD      xxx    COD
3     SILVER  INC     xxx    xxx    xxx      ADD    ADD
4      PO BOX 988     xxx    xxx    xxx      ADD    ADD
5        LA 70520     xxx    xxx    xxx      ADD    ADD
6      02/12/2019     xxx    DAT    xxx      xxx    DAT

相关问题 更多 >