有关将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])