如何将包含多个列表的文本文件加载到 Pandas 中?

问题描述 投票:0回答:1

我有一个文本文件,我想将其加载到

Pandas dataframe
中并从中创建一些绘图。 该数据是一些 GPS 卫星数据,包含任何给定时间段内可见的多个卫星的信息。 我的文本文件采用以下简化结构:

1077, 473055000, 0, 1,['003','1C','0.002','0.003','38','-0.4']['003','1W','0.032','0.023','40','-0.4']['006','1C','0.124','0.333','19','-0.5']['006','1W','0.100','0.232','29','-0.6']
1077, 473056000, 0, 1,['003','1C','0.012','0.004','39','-0.5']['003','1W','0.042','0.025','41','-0.41']['006','1C','0.125','0.343','39','-0.53']['006','1W','0.110','0.234','39','-0.56']['006','5Q','0.330','0.234','36','-0.51']

我希望在数据框中看到的内容,以便可以绘制如下:

1077, 473055000, 0, 1,003,1C,0.002,0.003,38.5,-0.4
1077, 473055000, 0, 1,003,1W,0.032,0.023,40.6,-0.4
1077, 473055000, 0, 1,006,1C,0.124,0.333,19.2,-0.5
1077, 473055000, 0, 1,006,1W,0.100,0.232,29.3,-0.6
1077, 473056000, 0, 1,003,1C,0.012,0.004,39.2,-0.5
1077, 473056000, 0, 1,003,1W,0.042,0.025,41.6,-0.41
1077, 473056000, 0, 1,006,1C,0.125,0.343,39.8,-0.53
1077, 473056000, 0, 1,006,1W,0.110,0.234,39.2,-0.56
1077, 473056000, 0, 1,006,5Q,0.330,0.234,36.4,-0.51

仅供澄清,

473055000
473056000
是从 GPS 周开始算起的毫秒数。我需要单独转换为 UTC,但这是另一个问题。括号中的值来自单独的卫星(括号中第一个值中的 003 和 006),以及来自这些卫星的不同消息类型(1C、1W 和 5Q 值,括号中第二个值)。

鉴于上述数据集,我尝试使用以下代码将其加载到 Python Pandas DataFrame 中:

import pandas as pd

file = r'D:\projects\test-data.csv'

df = pd.DataFrame(file,columns = ['id','time','steer','extclk','prn','msg','pseudoR','carrPh','A','CNR','B','C'])

print(df)

但是,我收到以下消息:

ValueError: DataFrame constructor not properly called.

从 csv 文件加载数据通常非常简单,但是,我在此文件中的数据结构使事情变得非常复杂。有人对我如何实现这一目标有任何建议吗?

python pandas
1个回答
0
投票

您有几个问题需要解决。 首先,该文件不是 CSV 格式。 它接近于 1,但标准 CSV 阅读器无法正确解析它。 其次,使用

read_<format>
方法之一将文件加载到 Pandas 数据框中:
read_csv
read_json
read_feather
等。

要使用

pd.DataFrame
,我们必须传入Python中已有的数据。 要获取文件中的数据,您需要使用自定义解析器。 解析数据后,就可以将其放入数据框中。

def parse_bracket(b_str:str):
    b = b_str.strip('[]').replace("'", '')
    prn, msg, ps, c, A, CNR = b.split(',')
    return {
        'prn': prn,
        'msg': msg,
        'pseudoR': float(ps),
        'carrPh': float(c),
        'A': float(A),
        'CNR': float(CNR)
    }

def parse_row(row: str):
    id_, time, steer, extclk, brackets = row.split(',', 4)
    id_, time, steer, extclk = map(int, [id_, time, steer, extclk])
    d = {'id': id_, 'time': time, 'steer': steer, 'extclk': extclk}
    data = []
    for bracket in brackets.split(']['):
        data.append(d | parse_bracket(bracket))
    return data

with open('D:/projects/test-data.csv') as fp:
    data = []
    for row in fp:
        data.extend(parse_row(row))
    df = pd.DataFrame(data)

以下是

df
的内容:

     id       time  steer  extclk  prn msg  pseudoR  carrPh     A   CNR
0  1077  473055000      0       1  003  1C    0.002   0.003  38.0 -0.40
1  1077  473055000      0       1  003  1W    0.032   0.023  40.0 -0.40
2  1077  473055000      0       1  006  1C    0.124   0.333  19.0 -0.50
3  1077  473055000      0       1  006  1W    0.100   0.232  29.0 -0.60
4  1077  473056000      0       1  003  1C    0.012   0.004  39.0 -0.50
5  1077  473056000      0       1  003  1W    0.042   0.025  41.0 -0.41
6  1077  473056000      0       1  006  1C    0.125   0.343  39.0 -0.53
7  1077  473056000      0       1  006  1W    0.110   0.234  39.0 -0.56
8  1077  473056000      0       1  006  5Q    0.330   0.234  36.0 -0.51
© www.soinside.com 2019 - 2024. All rights reserved.