我有一个df
,其中有一列parsed xml
,该列包含每一行的字典列表,每一行都有已解析的属性。看起来是这样的:
id type length parsed
0 1 A 144 [{'key1':'value1'},{'key1':'value2', 'key2':'value3'},...]
1 1 B 20 [{'key1':'value4'},{'key2':'value5'},...]
2 4 A 54 [{'key3':'value6'},...]
我使用下面的内容将这些词典扩展到其他列中
s = df['parsed xml'].explode()
t = (df.join(pd.DataFrame(s.tolist(), index = s.index).groupby(level=0).agg(lambda x: x.dropna().tolist()), /
lsuffix = '_x', rsuffix = '_y')).applymap(lambda x: x[0] if (type(x)==list and len(x)==1) else x)
这给了我一个这样的数据帧,这就是我想要的:
id type length key1 key2 key3
0 1 A 144 [value1,value2] value3
1 1 B 20 value4 value5
2 4 A 54 value6
问题是,对于5000条记录,到达此数据帧的代码大约需要45秒,但似乎永远不会停止,因为它用于12000条记录。似乎是groupby
造成了这种情况,但这能更有效吗
您可以使用
stack
和unstack
稍微更改方法以优化一点,并仅对创建的列执行applymap
。像这样:现在在性能方面,我看到像这里这样的3行数据帧的性能提高了2,但随着数据帧的大小而增加(3K行的性能提高了6倍)。速度的提高取决于列解析中每个列表中的元素数量以及不同键的数量
相关问题 更多 >
编程相关推荐