【问题标题】:Python - count successive leading digits on a pandas row string without counting non successive digitsPython - 计算熊猫行字符串上的连续前导数字而不计算非连续数字
【发布时间】: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。我可以将结果保存在列中以进行统计。

【问题讨论】:

    标签: python regex pandas


    【解决方案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()。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多