使用pandas创建过滤值

wqnecbli  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(97)

我有一个csv文件,其中第一行内容如下:

Pyscip_V1.11 Ref: #001=XYZ_0[1234] #50=M3_0[112] #51=M3_1[154] #52=M3_2[254]...

字符串
等等。我想做的是创建过滤后的值,这样第一列是Ref,它接受#符号后面的所有值,如001,50,51,52. M3_3..

header_pattern = r'Pyscip_V(\d+\.\d+) Ref:'

version_match = re.search(header_pattern, first_line.iloc[0, 0])
version_number = version_match.group(1) if version_match else ''

matches = re.findall(r'#(\d+)=(\w+_\d)\[([\d]+)\]', first_line.iloc[0, 0])

parsed_df = []
for match in matches:
    row_dict = {
        'Ref': match[0] if match[0] else '',
        'ID': match[1] if match[1] else '',
        'Ser_No': match[2] if match[2] else ''
    }
    parsed_df.append(row_dict)

new_df = pd.DataFrame(parsed_df)


不过,我只得到了一个完整的框架。这里有什么问题吗?
编辑:第三行的数据如下所示:

ID  Date    XYZ_0  M3_0   M3_1  M3_2    
1   22.12.2023  12.6  0.5 1.2   2.3


预期的结果是

Ref ID Num
001 XYZ_0 1234
50 M3_0 112
51 M3_1 154

4zcjmb1e

4zcjmb1e1#

我会打开CSV文件,提取第一行并处理它,只有在用pandas读取CSV的其余部分之后。
对于这一点,你最初的方法和正则表达式是很好的。

import re
import pandas as pd

with open('my_csv.csv') as f:
    first_line = next(f)
    header_df = pd.DataFrame(re.findall(r'#(\d+)=(\w+_\d)\[([\d]+)\]',
                                        first_line),
                             columns=['Ref', 'ID', 'Num'])
    
    data_df = pd.read_csv(f, sep=r'\s+')

print(header_df)
print(data_df)

字符串
输出量:

# header_df
   Ref     ID   Num
0  001  XYZ_0  1234
1   50   M3_0   112
2   51   M3_1   154
3   52   M3_2   254

# data_df
   ID        Date  XYZ_0  M3_0  M3_1  M3_2
0   1  22.12.2023   12.6   0.5   1.2   2.3

py49o6xq

py49o6xq2#

你可以试试(regex101 link):

import re
import pandas as pd

text = """\
Pyscip_V1.11 Ref: #001=XYZ_0[1234] #50=M3_0[112] #51=M3_1[154] #52=M3_2[254]
"""

pat = r"#(\d+)=([^[]+)\[([^\]]+)\]"

data = []
for line in text.splitlines():
    for a, b, c in re.findall(pat, line):
        data.append((a, b, c))

df = pd.DataFrame(data, columns=["Ref", "ID", "Num"])
print(df)

字符串
印刷品:

Ref     ID   Num
0  001  XYZ_0  1234
1   50   M3_0   112
2   51   M3_1   154
3   52   M3_2   254

相关问题