python pandas删除字符串条件的行

时间:2017-05-10 09:05:46

标签: python pandas

我有一个包含字符串和整数列的数据框。 在其中一个包含字符串的列上,我想搜索该列的所有项目以获取特定的子字符串,请说“abc”,如果子字符串存在则删除该行。我怎么做?这听起来很容易,但不知怎的,我为此而苦恼。 子字符串始终是最后三个字符。 我尝试了以下方法:

df1 = df.drop(df[df.Hostname[-4:]== "abc"])

给了我

  

UserWarning:Boolean系列键将重新编制索引以匹配DataFrame   索引

所以我尝试修改该列中的值并过滤掉最后没有“abc”的所有值:

red = [c for c in df.Hostname[-4:] if c != 'abc']

给了我

  

KeyError('%s不在索引'%objarr [mask]中)

我做错了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用boolean indexing,如果需要检查列4的上一个3Hostname)个字符,请添加indexing with str并将条件从==更改为!=

df1 = df[df.Hostname.str[-4:] != "abc"]

或者也许:

df1 = df[df.Hostname.str[-3:] != "abc"]

样品:

df = pd.DataFrame({'Hostname':['k abc','abc','dd'],
                  'b':[1,2,3],
                  'c':[4,5,6]})
print (df)
  Hostname  b  c
0    k abc  1  4
1      abc  2  5
2       dd  3  6

df1 = df[df.Hostname.str[-3:] != "abc"]
print (df1)
  Hostname  b  c
2       dd  3  6

如果需要检查最后一个字符,还可以使用str.endswith

df1 = df[~df.Hostname.str.endswith("abc")]
print (df1)
  Hostname  b  c
2       dd  3  6

编辑:

如果需要检查最后4个字符abc,然后删除行首先提取值,然后使用str.contains

df1 = df[~df.Hostname.str[-4:].str.contains('abc')]
print (df1)
  Hostname  b  c
2       dd  3  6

EDIT1:

对于默认索引add reset_index - python计数形式为0,因此索引值为0,1,2,...

df1 = df[df.Hostname.str[-3:] != "abc"].reset_index(drop=True)