首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据列的列名(包含列的子字符串和行)选择列符合条件。

根据列的列名(包含列的子字符串和行)选择列符合条件。
EN

Stack Overflow用户
提问于 2021-12-13 14:03:44
回答 1查看 60关注 0票数 0

我的意见:

代码语言:javascript
复制
mydata = (pd.DataFrame({'xyz':['Label','NG-ICV','NG-ICV','NG-ICV','ICV','ICV','ICV','NG-ICV','NG-ICV','Label',], 
                'foo':['Label','Label','Label','Label','Label','Label','Label','Label','Label','Label'],
                'bar':['Label','Label','Label','Label','NG-ICV','NG-ICV','ICV','ICV','NG-ICV','NG-ICV']}))    

我的必要代码计算两种模式之间的比率,并找出哪一列是最大的比率:

代码语言:javascript
复制
patNG = "NG-ICV"
pat = "ICV"
x=mydata.apply(lambda x: x.str.contains(patNG, regex=True).sum(), axis=0)
y=mydata.apply(lambda x: x.str.contains(pat, regex=True).sum(), axis=0)
z=x/y  
z=z.dropna()
mask=z.index.values.tolist()

现在,我希望在mask的两个条件列名中选择具有索引的行,并且只选择patNGpat为True的行(其中的行值等于'ICV‘或’NG‘)。例如,对于列xyz,我希望如下所示:

代码语言:javascript
复制
  xyz 
4 NG-ICV
5 NG-ICCV
6 ICV
7 ICV
8 NG-ICV
9 NG-ICV

我的代码:

代码语言:javascript
复制
mydata.loc[  :,[mask[0] in i for i in mydata.columns] ]

在这里,如何再添加一个条件,使行的值也等于我的两个模式(‘pat’和'patNG')?

我必须使用正则表达式和模式,因为我的数据不是像ICV这样的标签,而是与其他标签的长字符串。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-13 14:13:31

按照您的逻辑,您应该在求和之前保留模式的初始检测。然后在检测到的列上应用一个掩码来选择您的行:

代码语言:javascript
复制
X = mydata.apply(lambda x: x.str.contains(patNG, regex=True), axis=0)
Y = mydata.apply(lambda x: x.str.contains(pat, regex=True), axis=0)

x = X.sum()
y = Y.sum()
z = (x/y).dropna()
mask = z.index.values.tolist()

mydata.loc[(X|Y)[mask].all(1)]

产出:

代码语言:javascript
复制
      xyz    foo     bar
4     ICV  Label  NG-ICV
5     ICV  Label  NG-ICV
6     ICV  Label     ICV
7  NG-ICV  Label     ICV
8  NG-ICV  Label  NG-ICV
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70335919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档