Pandas们用groupby爆列的速度非常慢

2024-03-29 01:18:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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造成了这种情况,但这能更有效吗


Tags: iddftypexmlparsedlengthkey2key1
1条回答
网友
1楼 · 发布于 2024-03-29 01:18:09

您可以使用stackunstack稍微更改方法以优化一点,并仅对创建的列执行applymap。像这样:

s = df['parsed'].explode()
df_join = (pd.DataFrame(s.tolist(), index = s.index)
             .stack()
             .groupby(level=[0,1])
             .agg(list)
             .apply(lambda x: x[0] if len(x)==1 else x)
             .unstack(fill_value='')
          )
t = df.join(df_join)
print (t) # I did not used exactly your input
  id                                             parsed              key1  \
0  a  [{'key1': 'value1'}, {'key1': 'value2', 'key2'...  [value1, value2]   
1  b           [{'key1': 'value4'}, {'key2': 'value5'}]            value4   
2  c                               [{'key3': 'value6'}]                     

     key2    key3  
0  value3          
1  value5          
2          value6  

现在在性能方面,我看到像这里这样的3行数据帧的性能提高了2,但随着数据帧的大小而增加(3K行的性能提高了6倍)。速度的提高取决于列解析中每个列表中的元素数量以及不同键的数量

相关问题 更多 >