我还是个新手,在提取数据时遇到了一些麻烦,如果数据不清楚,请见谅.

我正在try 从一个大型数据集(>2亿行)中提取信息,并且需要将它们建立在几个基础之上.

首先,每一行都有一个ID,都是相同的格式,3个字母,然后是一系列数字,单元格中没有额外的信息.

其次,编码单元包含4个字母的编码(CODE、DIFF、RAND等)和单元中的一些其他信息.然而,一个问题是,4个字母的代码有时可以附加到‘SS’,使它们看起来像(CoDeSS,SSDIFF,RANDSS).

最后,Description列包含我要提取的数据,该数据已作为自由文本描述输入.数据的范围在XX12345和XX12345678之间,其中XX是一组2个字母,由(XX|XY|XZ|YZ)组合而成.

例如,我的列如下所示:

ID CODE DESCRIPTION
ID123 rdm CODE Some free text and the data required XX123
ID124 RAND Rdm Some text, no required data here and more text
ID125 DIFFSS... XY12345 and some text, plus more text within this box, and more desired data XY123456 and also YZ1234567

我要做的是将此信息提取到以下格式的新数据框中:

ID CODE EXTRACT
ID123 CODE XX123
ID125 DIFF XY12345
ID125 DIFF XY123456
ID125 DIFF YZ1234567

我遇到的一个大问题是,我寻找的大多数命令和一些类似的问题是,使用str.Match或str.Extract似乎只有在每一行都有这些值之一时才起作用,但对于这个数据集来说并非如此.

我try 了很多不同的方法,但一直被困在所有不同的部分,希望有人能用这个把我引向正确的方向?

谢谢!

推荐答案

根据您的描述,您应该能够使用:

df['CODE'] = df['CODE'].str.extract(r'\b([A-Z]{4})(?:SS)?\b')
df['EXTRACT'] = df.pop('DESCRIPTION').str.findall(r'\b((?:X[XYZ]|YZ)\d{5,8})\b')
df = df.explode('EXTRACT').dropna().reset_index(drop=True)

样例数据的输出(请注意,ID123没有输出,因为XX的值只有3位数,而您在问题中说应该至少有5位数)

      ID  CODE    EXTRACT
0  ID125  DIFF    XY12345
1  ID125  DIFF   XY123456
2  ID125  DIFF  YZ1234567

Python相关问答推荐

Pandas 第二小值有条件

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

如何在箱形图中添加绘制线的传奇?

图像 pyramid .难以创建所需的合成图像

如何在python polars中停止otherate(),当使用when()表达式时?

当独立的网络调用不应该互相阻塞时,'

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

cv2.matchTemplate函数匹配失败

UNIQUE约束失败:customuser. username

在Python中调用变量(特别是Tkinter)

网格基于1.Y轴与2.x轴显示在matplotlib中

如何排除prefecture_related中查询集为空的实例?

通过追加列表以极向聚合

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

查看pandas字符列是否在字符串列中

为罕见情况下的回退None值键入

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

在聚合中使用python-polars时如何计算模式

将时间序列附加到数据帧

基于2级列表的Pandas 切片3级多索引