解析文本文件python并转换为pandas datafram

2024-04-27 22:06:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解析一个文本文件,将其转换为pandas数据帧。 文件(包括空行):

HEADING1
value 1

HEADING2
value 2

HEADING1,
value 11

HEADING2
value 12

应转换为dataframe

^{pr2}$

我尝试了以下代码。但是,我不确定使用converters是否有效?在

df = pd.read_table(textfile, header=None, skip_blank_lines=True, delimiter='\n',
                   # converters= 'what should I use?',
                   names= 'HEADING1, HEADING2'.split() )

Tags: 文件数据代码dataframepandasdfreadvalue
2条回答

使用defaultdict

from collections import defaultdict
from io import StringIO
import pandas as pd

txt = """HEADING1
value 1

HEADING2
value 2

HEADING1
value 11

HEADING2
value 12"""

d = defaultdict(list)
[
    d[k].append(v)
    for k, v in [line.split('\n')
    for line in StringIO(txt).read().split('\n\n')]
];
pd.DataFrame(d)

   HEADING1  HEADING2
0   value 1   value 2
1  value 11  value 12

您自己解析文本并在'\n\n'上拆分

# split file by `'\n\n'` to get rows
# split again by `'\n'` to get columns
# `zip` to get convenient lists of headers and values
cols, vals = zip(
    *[line.split('\n') for line in open(textfile).read().split('\n\n')]
)

# construct a `pd.Series`
# note: your index contained in the `cols` list will not be unique
s = pd.Series(vals, cols)

# we'll need to enumerate the duplicated index values so that we can unstack
# we do this by creating a `pd.MultiIndex` with `cumcount` then the header values
s.index = [s.groupby(level=0).cumcount(), s.index]

# finally, `unstack`
s.unstack()

   HEADING1  HEADING2
0   value 1   value 2
1  value 11  value 12

故障

list理解

^{pr2}$

使用zip

list(zip(*[line.split('\n') for line in StringIO(txt).read().split('\n\n')]))

[('HEADING1', 'HEADING2', 'HEADING1', 'HEADING2'),
 ('value 1', 'value 2', 'value 11', 'value 12')]

设置cols和{}

cols, vals = zip(*[line.split('\n') for line in StringIO(txt).read().split('\n\n')])

print(cols)
print()
print(vals)

('HEADING1', 'HEADING2', 'HEADING1', 'HEADING2')

('value 1', 'value 2', 'value 11', 'value 12')

制作一系列

s = pd.Series(vals, cols)
s

HEADING1     value 1
HEADING2     value 2
HEADING1    value 11
HEADING2    value 12
dtype: object

枚举索引值

s.index = [s.groupby(level=0).cumcount(), s.index]
s

0  HEADING1     value 1
   HEADING2     value 2
1  HEADING1    value 11
   HEADING2    value 12
dtype: object

unstack

s.unstack()

   HEADING1  HEADING2
0   value 1   value 2
1  value 11  value 12

完整演示

import pandas as pd
from io import StringIO

txt = """HEADING1
value 1

HEADING2
value 2

HEADING1
value 11

HEADING2
value 12"""

cols, vals = zip(*[line.split('\n') for line in StringIO(txt).read().split('\n\n')])

s = pd.Series(vals, cols)
s.index = [s.groupby(level=0).cumcount(), s.index]

s.unstack()

   HEADING1  HEADING2
0   value 1   value 2
1  value 11  value 12

相关问题 更多 >