仅当元素在逗号前有一个数字(末尾)时,我才尝试计数。
示例:
12,12,12 = 3
BOOK ,, NO,06,07 = 5 <-应该是2
401-402-403-404-405,301-302-303-304-305 = 2 <-这应该是10
G2,G3,G4 <-应该是3
数据中包含各种特殊字符和东西,但我用逗号代替了“-”,似乎也造成了问题。一些书被分配了a-2,b-01,因此应该算作1,而不是2。我该怎么办?
代码:
import string
data['book_no']=data.book_no.replace(r'[!"#$%&\'()*+/.:;<>?@[\]^_`{|}~]', ',', regex=True)
data['book_no']=data.book_no.str.strip(string.punctuation);
data['total_books']=data.book_no.str.split(r'[!"#$%&\'()*+,/:;<>?@[\]^_`{|}~]').str.len()
答案 0 :(得分:1)
您可以使用
data['total_books']=data['book_no'].str.findall(r'\d+(?![^,])|(?<=,)\d+').str.len()
正则表达式匹配
\d+(?![^,])
-1个以上的数字(\d+
)后跟逗号或字符串结尾((?![^,])
= (?=,|$)
)|
-或(?<=,)\d+
-1个以上的数字(\d+
)前面带有逗号((?<=,)
)。请参见regex demo和正则表达式图:
答案 1 :(得分:0)
我会尝试在每个破折号或逗号处分割,然后检查每个元素是否为数字。一种方法是:
def custom_count(your_string):
split_str = your_string.replace('-', ',').split(',')
return sum([x.strip().isdigit() for x in split_str])
这在您的示例中效果很好:
In [2]: custom_count('BOOK,,NO,06,07')
Out [2]: 2
In [3]: custom_count('401-402-403-404-405, 301-302-303-304-305')
Out [3]: 10
警告1 :is.digit()
不适用于带小数点的数字:
'3.14159'.isdigit()
False
警告2 :另外,请注意,数千个分隔符将被拆分为不同的数值,并将被计数多次。一百万,例如:
custom_count('1,000,000')
3