我正在通过首先将XMI / XML数据结构分解为字典来将其解析为熊猫数据框。当我在XMI的列表中遇到一个命名的元组时,列表中似乎最多有两个命名的元组(尽管大多数只有一个)。
为了处理这种情况,我正在执行以下操作:
if val is not None and val:
if len(val) == 1:
d['modifiedBegin'] = val[0].begin
d['modifiedEnd'] = val[0].end
d['modifiedBegin1'] = None
d['modifiedEnd1'] = None
else:
d['modifiedBegin1'] = val[1].begin
d['modifiedEnd1'] = val[1].end
我与此有关的问题是:a)我不能保证我要分解的清单中只有两个清单,并且b)感觉便宜,丑陋,只是明显的错误!
我真的很想提出一个更通用的解决方案,尤其是上面给出的a)。
我的数据如下:
val = [Span(xmiID=105682, begin=13352, end=13358, type='org.metamap.uima.ts.Span'), Span(xmiID=105685, begin=13368, end=13374, type='org.metamap.uima.ts.Span')]
我真的更愿意将其解析为数据帧中的两个独立行,而不是拥有更多列。主要问题是这两个元组都共享来自一个较大对象的公共数据,该对象看起来像:
Negation(xmiID=142613, id=None, negType='nega', negTrigger='without', modifier=[Span(xmiID=105682, begin=13352, end=13358, type='org.metamap.uima.ts.Span'), Span(xmiID=105685, begin=13368, end=13374, type='org.metamap.uima.ts.Span')])
因此,两行共享属性negType
和negTrigger
...什么是将其分解为插入到我的数据框中的更通用的方法。我虽然会在列表的长度大于1时对元素进行迭代,然后在每次迭代时将其插入到datframe中,但这似乎很麻烦。
因此,我期望的结果是拥有一个看起来像(减去索引和其他常见垃圾的数据框):
Negation
namedtuplenegation.modifier
中的每件事或者不是将XML解析为namedtuple的字典,而是跳过中间部分并创建一个字典-{'begin':[row0,row1,...],'end':[row0,row1,...],'negtrigger':[row0,row1,...],'negtype':[row0,row1,...]}
-来自XML