Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用带字段说明符的熊猫将平面文件读取到数据帧_Python_Pandas - Fatal编程技术网

Python 使用带字段说明符的熊猫将平面文件读取到数据帧

Python 使用带字段说明符的熊猫将平面文件读取到数据帧,python,pandas,Python,Pandas,我试图使用pandas将平面文件读入数据帧,但似乎无法获得正确的格式。“我的文件”每行表示的字段数可变,如下所示: TIME=20131203004552049|CHAN=FCJNJKDCAAANPCKEAAAAAAAA|EVNT=NVOCinpt|MIME=application/synthesis+ssml|TXID=NUAN-20131203004552049-FCJNJKDCAAANPCKEAAAAAAAA-txt|TXSZ=1167|UCPU=31|SCPU=15 TIME=20131

我试图使用pandas将平面文件读入数据帧,但似乎无法获得正确的格式。“我的文件”每行表示的字段数可变,如下所示:

TIME=20131203004552049|CHAN=FCJNJKDCAAANPCKEAAAAAAAA|EVNT=NVOCinpt|MIME=application/synthesis+ssml|TXID=NUAN-20131203004552049-FCJNJKDCAAANPCKEAAAAAAAA-txt|TXSZ=1167|UCPU=31|SCPU=15
TIME=20131203004552049|CHAN=FCJNJKDCAAANPCKEAAAAAAAA|EVNT=NVOCsynd|INPT=1167|DURS=5120|RSTT=stop|UCPU=31|SCPU=15
TIME=20131203004552049|CHAN=FCJNJKDCAAANPCKEAAAAAAAA|EVNT=NVOClise|LUSED=0|LMAX=100|OMAX=95|LFEAT=tts|UCPU=0|SCPU=0
我在
|
中有字段分隔符,我将所有唯一键的列表拉入
键列表
,并尝试使用以下方法读取数据:

keylist = ['TIME',
             'CHAN',
             # [truncated]
             'DURS',
             'RSTT']

test_fp = 'c:\\temp\\test_output.txt'
df = pd.read_csv(test_fp, sep='|', names=keylist)

这不正确地构建了数据帧,因为我没有指定任何方法来识别行中的键标签。我有点卡住了,不知道该用哪种方法进行研究——比如,我应该使用
。read_json()

不确定是否有一种巧妙的方法来进行研究。有时,当数据结构与规范有很大差异时,在Python端对其进行预处理是最容易的。当然,它并没有那么快,但由于您可以立即以更标准的格式保存它,所以通常不值得担心

单向:

with open("wfield.txt") as fp:
    rows = (dict(entry.split("=",1) for entry in row.strip().split("|")) for row in fp)
    df = pd.DataFrame.from_dict(rows)
产生

>>> df
                       CHAN  DURS      EVNT  INPT LFEAT LMAX LUSED  \
0  FCJNJKDCAAANPCKEAAAAAAAA   NaN  NVOCinpt   NaN   NaN  NaN   NaN   
1  FCJNJKDCAAANPCKEAAAAAAAA  5120  NVOCsynd  1167   NaN  NaN   NaN   
2  FCJNJKDCAAANPCKEAAAAAAAA   NaN  NVOClise   NaN   tts  100     0   

                         MIME OMAX  RSTT SCPU               TIME  \
0  application/synthesis+ssml  NaN   NaN   15  20131203004552049   
1                         NaN  NaN  stop   15  20131203004552049   
2                         NaN   95   NaN    0  20131203004552049   

                                                TXID  TXSZ UCPU  
0  NUAN-20131203004552049-FCJNJKDCAAANPCKEAAAAAAA...  1167   31  
1                                                NaN   NaN   31  
2                                                NaN   NaN    0  

[3 rows x 15 columns]
当你有了这个,你可以重塑需要。(我不确定是否要同时合并行&CHAN)


编辑:如果您使用的是旧版本的pandas,它不支持将生成器从_dict传递到
,则可以从列表中生成:

df = pd.DataFrame(list(rows))

但请注意,您必须在事后将列从字符串转换为数字列。

对不起,我不知道如何清楚地写出来,但我得到一个错误:
PandasError:DataFrame构造函数调用不正确。我正在使用Anaconda1.8.0中的Python 2.7.5。通过将示例文本的3行设置为
str='''
,然后将str.split('\n')中fp的
行更改为
,如果有意义,则进行测试。(链接到my)@tommy_o:str:
循环中fp的
与fp
行中我的
做了相同的事情,因此循环现在没有意义,这是第一个问题。你看到问题了吗?哦,天哪,对不起。您那里的代码(当使用我的1000行平面文件时)对我不起作用,然后我进一步破坏了它。此pastebin的内容为
test_output.txt
,代码(包括
PandasError
)来自IPython:。如果使用它,它对你有用吗?是的,非常有效。您使用的是哪个版本的
pandas
?(我用的是0.13)。。啊,就是这样。我刚刚在0.11版本中尝试过,收到了错误消息。让我看看如何在这个版本中做到这一点。看起来像是Anaconda1.8.0船上有熊猫0.12.0