Pandas:在最大n个分隔符后提取字符串

2024-09-30 18:24:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据如下所示:

        A_1         A_2         B_1         B_2         C_1         C_2
DP0001  11:01:01    11:01:01    15:35       51:02:01    07:02:04    15:02:01:01
DP0002  02:01:01:02 26:01:01    35:01:01:01 40:01:02    04:82       08:01:01
DP0003  11:01:01    11:01:01:01 15:02:01    56:04       01:02:01    08:01:01
DP0004  11:01:01    34:01:01    15:02:01    15:12       03:03:01:03 08:01:01

我想在最多3:之前提取字符串。期望输出:

        A_1         A_2         B_1         B_2         C_1         C_2
DP0001  11:01:01    11:01:01    15:35       51:02:01    07:02:04    15:02:01
DP0002  02:01:01    26:01:01    35:01:01    40:01:02    04:82       08:01:01
DP0003  11:01:01    11:01:01    15:02:01    56:04       01:02:01    08:01:01
DP0004  11:01:01    34:01:01    15:02:01    15:12       03:03:01    08:01:01

我尝试了多种方法,但到目前为止都没有成功:

  1. 使用正则表达式:
    df.stack().str.extract('^([\w]+:[\w]+:[\w]+)').unstack()[0]

但是,对于这种情况,它不能捕获只有1:的字符串并返回NaN

  1. 使用先分割后加入策略
    def six_digits(df_columns):
        return df_columns.str.split(':', expand=True).iloc[:, :3].apply(':'.join, axis=1)
    
    df.apply(lambda x: six_digits(x))

然后它在只有:的单元格中遇到None,并抛出一个错误

你能告诉我如何处理这个案子吗?多谢各位


Tags: columns数据方法字符串dfstackextractapply
2条回答

有了你们展示的样品,你们能试一下下面的吗。简单的解释是:使用replace函数并提及regex来匹配2位冒号2位冒号2位冒号2位,并根据OP的示例将所有其他内容保留为不需要

df.astype(str).replace(r'^((?:\d{2}:){2}\d{2})(.*)', r'\1', regex=True)

输出如下:

             A_1       A_2       B_1       B_2       C_1       C_2
DP0001  11:01:01  11:01:01     15:35  51:02:01  07:02:04  15:02:01
DP0002  02:01:01  26:01:01  35:01:01  40:01:02     04:82  08:01:01
DP0003  11:01:01  11:01:01  15:02:01     56:04  01:02:01  08:01:01
DP0004  11:01:01  34:01:01  15:02:01     15:12  03:03:01  08:01:01

DataFrame.replace

df.replace(r'^(\w+:\w+:\w+)(:.+)?', r'\1', regex=True)

             A_1       A_2       B_1       B_2       C_1       C_2
DP0001  11:01:01  11:01:01     15:35  51:02:01  07:02:04  15:02:01
DP0002  02:01:01  26:01:01  35:01:01  40:01:02     04:82  08:01:01
DP0003  11:01:01  11:01:01  15:02:01     56:04  01:02:01  08:01:01
DP0004  11:01:01  34:01:01  15:02:01     15:12  03:03:01  08:01:01

正则表达式详细信息:

  • ^:在行的开始处断言位置
  • (\w+:\w+:\w+):第一个捕获组
    • \w+:匹配任意单词字符一次或多次
    • ::按字面意思匹配字符:
  • (:.+):第二个捕获组
    • ::按字面意思匹配字符:
    • .+:匹配任意字符一次或多次
  • ?:在0和1之间匹配上一个标记

请参阅联机^{}

相关问题 更多 >