import pandas as pd

mydata = {"Key" : [567, 568, 569, 570, 571, 572] , "Sprint" : ["Max1;Max2", "Max2", "DI001 2", "DI001 25", "DAS 100" , "DI001 101"]}

df = pd.DataFrame(mydata)
df ["sprintlist"]= df["Sprint"].str.split(";")
print (df)

从这个数据帧中,我只想将列表中每个值的"Sprint tlist"列中的字符串最后部分中出现的数字提取到新列表"Sprint tnumb"中,如下所示

预期输出:

enter image description here

在我前面的一个查询中,我清楚地了解了当"Sprint"列中只有一个值时如何提取数字.我try 使用lambda函数来实现所需的输出,但收到错误"str‘对象没有属性’str‘"

 df["Sprint Number"] = df.Sprint.str.extract(r"(\d+)$").astype(int)

推荐答案

Series.explodeSeries.str.extractall一起使用,转换为数字和聚合列表:

df["Sprint Number"] = (df["sprintlist"].explode()
                                       .str.extractall(r"(\d+)$")[0]
                                       .astype(int)
                                       .groupby(level=0)
                                       .agg(list))
print (df)
   Key     Sprint    sprintlist Sprint Number
0  567  Max1;Max2  [Max1, Max2]        [1, 2]
1  568       Max2        [Max2]           [2]
2  569    DI001 2     [DI001 2]           [2]
3  570   DI001 25    [DI001 25]          [25]
4  571    DAS 100     [DAS 100]         [100]
5  572  DI001 101   [DI001 101]         [101]

或使用包含regex的列表综合:

df["Sprint Number"] = [[int(re.search('(\d+)$', y).group(0)) for y in x]
                        for x in df["sprintlist"]]
print (df)
   Key     Sprint    sprintlist Sprint Number
0  567  Max1;Max2  [Max1, Max2]        [1, 2]
1  568       Max2        [Max2]           [2]
2  569    DI001 2     [DI001 2]           [2]
3  570   DI001 25    [DI001 25]          [25]
4  571    DAS 100     [DAS 100]         [100]
5  572  DI001 101   [DI001 101]         [101]

如果可能,一些字符串不会以数字加上赋值运算符:=结尾,测试None:

import re

mydata = {"Key" : [567, 568, 569, 570, 571, 572] , 
          "Sprint" : ["Max1;Max", "Max2", "DI001 2", "DI001 25", "DAS 100" , "DI001 101"]}

df = pd.DataFrame(mydata)
df ["sprintlist"]= df["Sprint"].str.split(";")

df["Sprint Number"] = [[int(m.group(0)) 
                       for y in x if( m:=re.search('(\d+)$', y)) is not None] 
                       for x in df["sprintlist"]]
print (df)
   Key     Sprint   sprintlist Sprint Number
0  567   Max1;Max  [Max1, Max]           [1]
1  568       Max2       [Max2]           [2]
2  569    DI001 2    [DI001 2]           [2]
3  570   DI001 25   [DI001 25]          [25]
4  571    DAS 100    [DAS 100]         [100]
5  572  DI001 101  [DI001 101]         [101]
    

Python相关问答推荐

GEKKO:已知延迟的延迟系统的参数估计

如何处理必须存在于环境中但无法安装的Python项目依赖项?

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

具有多个选项的计数_匹配

更改matplotlib彩色条的字体并勾选标签?

Odoo 14 hr. emergency.public内的二进制字段

在Python Attrs包中,如何在field_Transformer函数中添加字段?

加速Python循环

Python虚拟环境的轻量级使用

在vscode上使用Python虚拟环境时((env))

所有列的滚动标准差,忽略NaN

给定高度约束的旋转角解析求解

如何指定列数据类型

如何在FastAPI中为我上传的json文件提供索引ID?

在极中解析带有数字和SI前缀的字符串

Geopandas未返回正确的缓冲区(单位:米)

从源代码显示不同的输出(机器学习)(Python)

根据客户端是否正在传输响应来更改基于Flask的API的行为