我有以下虚拟 df:
columns = ['answer']
data = ['hello there', '-1', '0.5', '112', 'hello world I am 99 years old', '33 or 1', '19.20', '5+5-10+0.2', 'x=20']
df = pd.DataFrame(columns=columns, data=data)
我想计算仅包含数字或数字和 +- 符号(整数、浮点数、正数、负数)而不包含其他文本的条目。对于虚拟 df,这将是 5。即,除“hello world 我 99 岁”、“x=20”和“33 或 1”之外的所有条目) 我的做法如下:
def find_numbers(some_value):
if isinstance(some_value, int) or isinstance(some_value, float):
True
df['answer'].apply(lambda x: len([t for t in x.split() if find_numbers(t)])).sum()
不幸的是,它返回 0。
预期输出:5
那将是条目 -1、0.5、112、19.20、5+5-10+0.2。
我想我无论如何都需要将其更改为正则表达式,因为负数和带有“+”的数字没有被计算在内?
答案 0 :(得分:1)
寻找一个通过 ^
和 $
确保整个字符串具有 -, +, digit, .
的正则表达式:
non_text_count = df.answer.str.contains("^[-+\d\.]+$").sum()
# gives 5
<块引用>
计算包含数字AND文本
的条目数会是什么样子的[...]通过一种简单的方法,我们可以链接两个正则表达式:
contains_text = df.answer.str.contains("[A-Za-z]+")
contains_nums = df.answer.str.contains("[-+\d\.]+")
text_and_num_count = (contains_text & contains_nums).sum()
# gives 3