将dict导入dataframe时的TypeError

时间:2016-03-26 04:30:26

标签: xml pandas lxml stringio

有关将lxml.etree启动事件导入pandas.DataFrame的任何提示。以下代码显示了使用from_records简单的lxml解析和将条目转换为数据帧(pandas)。 [注意:我尝试了from_dict但是每个属性需要一个列表,而from_records似乎更好地处理字典。 ]

pd.DataFrame.from_record在强制数据属性时失败......有错误:

TypeError: Argument must be bytes or unicode, got 'int'

提前感谢任何提示?

CODE SNIPPET:

x2="""<m2>
  <entry attrm201=1 attrm202 attrm203=1>m0201_t</entry>
  <entry attrm201=1 attrm0203=1>m0202_t</entry>
  <entry displevel=1 entrytype=1>m0202_t</entry>
</m2>"""

import pandas as pd
objDF = pd.DataFrame()

import io
srcIO = io.StringIO(x2)
#srcIO = io.BytesIO(str.encode(x2))


from lxml import etree
for event, e in etree.iterparse(srcIO, recover=True, html=True, events=('start', 'end')):
    if event != 'start' : continue
    if e.tag != 'entry' : continue
    elmDict = e.attrib
    elmDict[e.tag] = e.text 
    df = pd.DataFrame.from_records(elmDict, index=[0])
    objDF = pd.concat([objDF, df])
    print(event, objDF)

更新#1 - 解决方法

用列表(即基本数据帧)替换Dataframe.from_record似乎可以解决问题。诀窍是将dict中的值提取到列表中,将键提取到列表中...然后pd.DataFrame能够封送dtypes。但是,我不确定为什么from_records不起作用? (抱歉没有时间深入挖掘代码)。以下是有效的代码......

# from_record doesn't work 
#df = pd.DataFrame.from_records(elmDict, index=[0])

# 
arr = []
arr.append(elmDict.values())
df = pd.DataFrame(arr, columns=elmDict.keys())
objDF = pd.concat([objDF, df])

0 个答案:

没有答案