我在一个csv文件中有数千行以下示例。文件的头如下所示:
文件头:
样本数据:field1, field2, field3, field4
field1, field2, 1,"[("entryA"、"typeA")("entryB"、"typeB")("entryC"、"typeC"),("entryD"、"类型")]">
我的问题是如何提取field3并将其与每个括号的第一个条目配对,并将其置于以下格式?
我需要什么:
我的代码:{"id"field3"entries": ["entryA", "entryB", "entryC", "entryD"]}
import pandas as pd
import re
df = pd.read_csv('file.csv')
id = df['field3']
entries = df['field4']
for row in entries:
result = entries.str.findall("(?<=(').*?(?=',)")
当前输出:当前的Regex工作,但是,我刚刚注意到,我有特殊的符号,如'('在我的条目影响匹配的结果(不需要的匹配)。
有个更好的办法。
import ast
s = ast.literal_eval(s)
entries = [a[0] for a in s]
后续
pandas没有帮助你。预处理数据,然后转换为pandas。看起来你想要的只是第三个字段和扩展后的第四个字段,所以我只保留了这些。
import re
import csv
import pandas as pd
headers = []
data = []
for row in csv.reader(open('file.csv')):
if not headers:
headers = row
else:
entries = [a[0] for a in ast.literal_eval(row[3]))
data.append( [row[2], entries] )
df = pd.DataFrame(data, columns=['id','entries'])
你不需要re
,使用ast.literal_eval
>>> s = "[('entryA', 'typeA'), ('entryB', 'typeB'), ('entryC', 'typeC'), ('entryD', 'typeD')]"
>>> from ast import literal_eval
>>> literal_eval(s)
[('entryA', 'typeA'), ('entryB', 'typeB'), ('entryC', 'typeC'), ('entryD', 'typeD')]
>>> out = [i[0] for i in literal_eval(s)]
>>> out
['entryA', 'entryB', 'entryC', 'entryD']
您需要使用前向和后向正则表达式来执行以下操作
s = "[('entryA', 'typeA'), ('entryB', 'typeB'), ('entryC', 'typeC'), ('entryD', 'typeD')]"
result = re.findall("(?<=(').*?(?=',)", s)
print(""entries":",result)
Lookahead: (?=EXPR)
查找元素正前方的内容。
Lookbehind: (?<=EXPR)
查看元素的正后方。
result = df.field4.str.extractall("((?<=(').*?(?=',))").to_numpy().reshape(2, 4)
给出(为了测试目的添加了额外的行)
array([['entryA', 'entryB', 'entryC', 'entryD'],
['entryA1', 'entryB1', 'entryC1', 'entryD1']], dtype=object)