我有一个包含2列,类型和文本的pandas数据框 text列包含字符串值。 如何删除文本列中包含一些数值的行。 e.g:
`ABC 1.3.2`, `ABC12`, `2.2.3`, `ABC 12 1`
我在下面尝试过,但收到错误。知道为什么会出错吗?
df.drop(df[bool(re.match('^(?=.*[0-9]$)', df['text'].str))].index)
答案 0 :(得分:4)
在您的情况下,我认为使用简单的索引而不是丢弃会更好。例如:
>>> df
text type
0 abc b
1 abc123 a
2 cde a
3 abc1.2.3 b
4 1.2.3 a
5 xyz a
6 abc123 a
7 9999 a
8 5text a
9 text a
>>> df[~df.text.str.contains(r'[0-9]')]
text type
0 abc b
2 cde a
5 xyz a
9 text a
找到没有数字文本的任何行
解释:
df.text.str.contains(r'[0-9]')
返回一个布尔系列,其中有任何数字:
0 False
1 True
2 False
3 True
4 True
5 False
6 True
7 True
8 True
9 False
您可以将其与~
一起用于索引数据框,无论哪里返回false
答案 1 :(得分:3)
来自jpp的数据
s[s.str.isalpha()]
Out[261]:
0 ABC
2 DEF
6 GHI
dtype: object
答案 2 :(得分:2)
假设您将数字定义为x.isdigit()
,评估为True
,您可以将any
与生成器表达式一起使用,并通过pd.Series.apply
创建一个布尔掩码:
s = pd.Series(['ABC', 'ABC 1.3.2', 'DEF', 'ABC12', '2.2.3', 'ABC 12 1', 'GHI'])
mask = s.apply(lambda x: not any(i.isdigit() for i in x))
print(s[mask])
0 ABC
2 DEF
6 GHI
dtype: object
答案 3 :(得分:1)
我在评论中问道,你对数字的定义是什么?如果我们使用isnumeric
跟踪python' split()
,我们会得到以下信息:
import pandas as pd
将pandas导入为pd
df = pd.DataFrame({
'col1': ['ABC', 'ABC 1.3.2', 'DEF', 'ABC12', '2.2.3', 'ABC 12 1', 'GHI']
})
m1 = df['col1'].apply(lambda x: not any(i.isnumeric() for i in x.split()))
m2 = df['col1'].str.isalpha()
m3 = df['col1'].apply(lambda x: not any(i.isdigit() for i in x))
m4 = ~df['col1'].str.contains(r'[0-9]')
print(df.assign(hasnonumeric=m1,isalhpa=m2, isdigit=m3, contains=m4))
# Opting for hasnonumeric
df = df[m1]
打印:
col1 hasnonumeric isalhpa isdigit contains
0 ABC True True True True
1 ABC 1.3.2 True False False False
2 DEF True True True True
3 ABC12 True False False False
4 2.2.3 True False False False
5 ABC 12 1 False False False False
6 GHI True True True True