熊猫选择列中的值不以字符串开头的行

Bar*_*ysz 5 python-3.x pandas anaconda jupyter-notebook

我有一个数据,我需要过滤掉以某个值s开头的任何行- 强调复数:

与文件 data.xlsx 中显示的完全相同的数据下方

Name                Remains
GESDSRPPZ0161       TRUE
RT6000996           TRUE
RT6000994           TRUE
RT6000467           TRUE
RT6000431           TRUE
MCOPSR0034          FALSE
MCOPSR0033          FALSE
Run Code Online (Sandbox Code Playgroud)

我需要能够返回名称MCO、GE等开头的数据帧。

import pandas as pd
import numpy as np

### data
file = r'C:\Users\user\Desktop\data.xlsx'

data  = pd.read_excel(file, na_values = '')
data['name'] = data['name'].str.upper()

prefixes = ['IM%','JE%','GE%','GV%','CHE%','MCO%']

new_data = data.select(lambda x: x not in prefixes)


new_data.shape
Run Code Online (Sandbox Code Playgroud)

最后一次调用返回与我开始时完全相同的数据集。

我试过:

大熊猫使用startswith从Dataframe中选择

但如果字符串在其他地方(不仅以开头),它会排除数据

df = df[df['Column Name'].isin(['Value']) == False]
Run Code Online (Sandbox Code Playgroud)

如果我确切地知道有问题的字符串,上面的答案会起作用,但是它会改变(公共部分是 MCOxxxxx、GVxxxxxx、GExxxxx...)

这个也发生了同样的事情:

如何为 Pandas 数据框实现“in”和“not in”

因为我必须传递的值必须是准确的。有什么办法可以使用与此处相同的逻辑(是否有与 SQL 这样的通配符等效的逻辑?):

如何选择列值以某个字符串开头的行?

感谢帮助!我们可以在下面扩展吗?

@jezrael 虽然为了简单起见我选择了另一种解决方案(并且我对您的解决方案缺乏了解),但我想请您做一些解释。什么是“^” +“| ^”做此代码,它是如何从文的解决方案有什么不同?当您将 for 循环构造与 map 或 apply 等系列操作相反时,它如何比较性能?如果我理解正确,contains()不会被位置所困扰,而startswith() 专门查看字符串的开头。这是否意味着 ^ 指示 contains() 做什么?从头开始?和| 它是该方法的另一个特殊字符还是被视为逻辑 OR?如果你不这样做,我真的很想学这个 不介意分享。谢谢

WeN*_*Ben 7

您可以使用startswith~前面的将从 in 转换为 not in

prefixes = ['IM','JE','GE','GV','CHE','MCO']

df[~df.Name.str.startswith(tuple(prefixes))]
Out[424]: 
        Name  Remains
1  RT6000996     True
2  RT6000994     True
3  RT6000467     True
4  RT6000431     True
Run Code Online (Sandbox Code Playgroud)