我有一个具有以下格式的文本文件:
1: frack 0.733, shale 0.700,
10: space 0.645, station 0.327, nasa 0.258,
4: celebr 0.262, bahar 0.345
Run Code Online (Sandbox Code Playgroud)
我需要将此文本转换为以下格式的DataFrame:
Id Term weight
1 frack 0.733
1 shale 0.700
10 space 0.645
10 station 0.327
10 nasa 0.258
4 celebr 0.262
4 bahar 0.345
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
Bra*_*mon 12
这是一种使用解析文件的优化方法re,首先获取ID,然后解析数据元组。这利用了文件对象可迭代的事实。在打开的文件上进行迭代时,您会获得单独的行作为字符串,从中可以提取有意义的数据元素。
import re
import pandas as pd
SEP_RE = re.compile(r":\s+")
DATA_RE = re.compile(r"(?P<term>[a-z]+)\s+(?P<weight>\d+\.\d+)", re.I)
def parse(filepath: str):
def _parse(filepath):
with open(filepath) as f:
for line in f:
id, rest = SEP_RE.split(line, maxsplit=1)
for match in DATA_RE.finditer(rest):
yield [int(id), match["term"], float(match["weight"])]
return list(_parse(filepath))
Run Code Online (Sandbox Code Playgroud)
例:
>>> df = pd.DataFrame(parse("/Users/bradsolomon/Downloads/doc.txt"),
... columns=["Id", "Term", "weight"])
>>>
>>> df
Id Term weight
0 1 frack 0.733
1 1 shale 0.700
2 10 space 0.645
3 10 station 0.327
4 10 nasa 0.258
5 4 celebr 0.262
6 4 bahar 0.345
>>> df.dtypes
Id int64
Term object
weight float64
dtype: object
Run Code Online (Sandbox Code Playgroud)
SEP_RE查找初始分隔符:文字,:后跟一个或多个空格。它采用maxsplit=1停止一旦第一分被发现。当然,这假设您的数据经过严格格式化:整个数据集的格式始终遵循问题中列出的示例格式。
在那之后,DATA_RE.finditer()处理从得出的每个(项,权重)对rest。字符串rest本身看起来像frack 0.733, shale 0.700,。 .finditer()为您提供了多个match对象,您可以在其中使用["key"]符号来访问给定命名捕获组(例如)中的元素(?P<term>[a-z]+)。
一种简单的可视化方法是使用line文件中的示例作为字符串:
>>> line = "1: frack 0.733, shale 0.700,\n"
>>> SEP_RE.split(line, maxsplit=1)
['1', 'frack 0.733, shale 0.700,\n']
Run Code Online (Sandbox Code Playgroud)
现在,您有了初始ID和其余组件,可以将其解压缩为两个标识符。
>>> id, rest = SEP_RE.split(line, maxsplit=1)
>>> it = DATA_RE.finditer(rest)
>>> match = next(it)
>>> match
<re.Match object; span=(0, 11), match='frack 0.733'>
>>> match["term"]
'frack'
>>> match["weight"]
'0.733'
Run Code Online (Sandbox Code Playgroud)
可视化的更好方法是使用pdb。如果你敢尝试一下;)
这是需要特定解决方案类型的问题之一,如果您放松对数据格式的限制,这些解决方案可能无法一概而论。
例如,假设每个每个Term只能接受大写或小写的ASCII字母,没有别的。如果您将其他Unicode字符用作标识符,则需要查看其他re字符,例如\w。
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |