我的数据是这样的:
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
我尝试了多种方法,但到目前为止都没有成功:
- 使用正则表达式:
df.stack().str.extract('^([\w]+:[\w]+:[\w]+)').unstack()[0]
但是,它无法捕获只有 1 个 :
的字符串并在这种情况下返回 NaN。
- 使用拆分然后加入策略
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
并抛出错误。
你能告诉我如何处理这个案子吗?谢谢
最佳答案
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+
: 匹配任何单词字符一次或多次:
: 匹配字符:
literally
(:.+)
: 第二个捕获组:
: 匹配字符:
literally.+
: 匹配任意字符一次或多次
?
:匹配前一个标记在零到一次之间
在线查看regex demo
关于python - Pandas:在最大第 n 个定界符之后提取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67211118/