Python - 计算熊猫行字符串上的连续前导数字而不计算非连续数字

Posted

技术标签:

【中文标题】Python - 计算熊猫行字符串上的连续前导数字而不计算非连续数字【英文标题】:Python - count successive leading digits on a pandas row string without counting non successive digits 【发布时间】:2022-01-24 02:12:40 【问题描述】:

我需要创建一个新列来计算前导 0 的数量,但是我在尝试这样做时遇到了错误。 我根据 mongo 上的以下正则表达式 [\^0[0]*[1-9][0-9]*\] 从 mongo 中提取数据并将其保存到 csv 文件中。这是所有以 0 开头的“序列”。

df['Sequence'].str.count('0')

df['Sequence'].str.count('0[0]*[1-9][0-9]')

给出以下结果。如您所见,两个“count”字符串返回也将计算非前导 0。或者只是 0 的总数。

    Sequence    0s
0   012312312   1
1   024624624   1
2   036901357   2
3   002486248   2
4   045074305   3
5   080666140   3

我也尝试使用在测试时有效的循环编写,但在数据帧上使用它时,我遇到以下**IndexError: string index out of range**

results = []
count = 0 
index = 0
for item in df['Sequence']:
    count = 0 
    index = 0
    while (item[index] == "0"):  
            count = count + 1          
            index = index + 1
    results.append(count)
df['0s'] = results
df

简而言之;如果我能为 001230 子字符串得到 2 而不是 3。我可以将结果保存在列中以进行统计。

【问题讨论】:

【参考方案1】:

您可以使用 extract^(0*) 正则表达式来仅匹配前导零。然后使用str.len获取长度。

df['0s'] = df['sequence'].str.extract('^(0*)', expand = False).str.len()

示例输入:

df = pd.DataFrame('sequence': ['12040', '01230', '00010', '00120'])

输出:

  sequence  0s
0    12040   0
1    01230   1
2    00010   3
3    00120   2

【讨论】:

【参考方案2】:

你可以使用这个正则表达式:

'^0+'

^ 表示,捕获模式是否从字符串的开头开始。 +表示,如果至少出现一次或多次,则捕获。

【讨论】:

【参考方案3】:

IIUC,你想计算前导 0 的数量,对吧?将type str 的整数转换为type int 的整数时,前导0 会消失。这是一个解决方案:

df['leading 0s'] = df['Sequence'].str.len() - df['Sequence'].astype(int).astype(str).str.len()

输出:

    Sequence  leading 0s
0  012312312           1
1  024624624           1
2  036901357           1
3  002486248           2
4  045074305           1
5  080666140           1

【讨论】:

这是一个有趣的方法。但是,当与最终数据一起使用时,我得到 Python int 太大而无法转换为 C long 错误。【参考方案4】:

试试str.findall:

df['0s'] = df['Sequence'].str.findall('^0*').str[0].str.len()
print(df)

# Output:
    Sequence  0s
0  012312312   1
1  024624624   1
2  036901357   1
3  002486248   2
4  045074305   1
5  080666140   1

【讨论】:

目标是只匹配前导零(见我的回答);) 你是对的。感谢您的信息和很好的回答:) @Corralien,谢谢,它成功了。我真的坚持使用 .count('^0*'),从未想过 str.findall()。谢谢。

以上是关于Python - 计算熊猫行字符串上的连续前导数字而不计算非连续数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫列后期操作中保持前导零?

熊猫遍历行以查看值是不是为字母数字[重复]

如何计算熊猫数据框中的非字母数字字符

需要忽略python中数字计数功能的前导零

如何在熊猫 DF 列中删除连续的相似数字

967.连续差相同的数字(使用JavaScript解答,迭代 BFS广度优先算法回顾)