我有一个包含字符串和整数列的数据框。 在其中一个包含字符串的列上,我想搜索该列的所有项目以获取特定的子字符串,请说“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]中)
我做错了什么?
感谢您的帮助!
答案 0 :(得分:1)
使用boolean indexing
,如果需要检查列4
的上一个3
(Hostname
)个字符,请添加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)