本文已参与「新人创作礼」活动,一起开启掘金创作之路。
引言
本文想要解决的问题是当DataFrame中某一列元素为不定长度的数组时,该如何对它将数组进行拆分,取其子元素单独成列,从而进行进一步的提取操作。给出原始的数据格式见如下图所示:
解决方法
这个问题的解决思路比较简单,首先是要将含不定长的数组的列单独提取出来,将其list元素填充成等长的list,使得所有的list元素具有相同的长度,从而后续可以直接转换为元素为单一值的标准numpy数组。完成后将该numpy数组再转化datafram,再和原DataFrame合并即可完成操作。
填充的部分使用了map()方法来实现,长度不够的用np.nan填充,实现前还需要获得数组的最大长度以确定填充数目。代码见下:
a=[[['a','d'],['b'],['a','c']],[1,2,3],[4,5,6]]
df=pd.DataFrame(a).T
used_col=df[0]
length=used_col.map(lambda x:len(x))
max_l=length.max()
temp=used_col.map(lambda x:x+[np.nan]*(max_l-len(x)))
temp=np.array(temp.to_list())
temp=pd.DataFrame(temp)
df=df.drop(0,axis=1)
temp.columns=['cat1','cat2']
output=df.join(temp)
结果如下:
pd.DataFrame(a).T
Out[13]:
0 1 2
0 [a, d] 1 4
1 [b] 2 5
2 [a, c] 3 6
output
Out[14]:
1 2 cat1 cat2
0 1 4 a d
1 2 5 b nan
2 3 6 a c
总结
笔者解决这个问题的关键思路就是将元素为不定长list的一列取出来作为新的DataFrame,但没有找到好的办法实现长度不够自动补齐,无奈使用map()函数手动补齐。这个问题其实不是笔者遇到的,只是在问答区回答别人提问时花了点时间解决了一下,再加上最后没有被题主所采纳感觉很可惜,就发出来和大家分析一下自己的解法,可能会略显粗糙。