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)
最后一次调用返回与我开始时完全相同的数据集。
我试过:
但如果字符串在其他地方(不仅以开头),它会排除数据
df = df[df['Column Name'].isin(['Value']) == False]
Run Code Online (Sandbox Code Playgroud)
如果我确切地知道有问题的字符串,上面的答案会起作用,但是它会改变(公共部分是 MCOxxxxx、GVxxxxxx、GExxxxx...)
这个也发生了同样的事情:
因为我必须传递的值必须是准确的。有什么办法可以使用与此处相同的逻辑(是否有与 SQL 这样的通配符等效的逻辑?):
感谢帮助!我们可以在下面扩展吗?
@jezrael 虽然为了简单起见我选择了另一种解决方案(并且我对您的解决方案缺乏了解),但我想请您做一些解释。什么是“^” +“| ^”做此代码,它是如何从文的解决方案有什么不同?当您将 for 循环构造与 map 或 apply 等系列操作相反时,它如何比较性能?如果我理解正确,contains()不会被位置所困扰,而startswith() 专门查看字符串的开头。这是否意味着 ^ 指示 contains() 做什么?从头开始?和| 它是该方法的另一个特殊字符还是被视为逻辑 OR?如果你不这样做,我真的很想学这个 不介意分享。谢谢
您可以使用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)