如何有效地扩展/展平pandas数据帧
发布时间:2020-12-20 11:57:49 所属栏目:Python 来源:网络整理
导读:我有一个数据集,在其中一个列上,每个元素都是一个列表. 我想将它弄平,这样每个列表元素都会有一行自己的行. 我设法用iterrows,dict和append解决它(见下文),但是我的真DF很大. 有没有办法让事情变得更快? 我可以考虑用另一种格式(可能是分层df?)替换每个元
我有一个数据集,在其中一个列上,每个元素都是一个列表.
我想将它弄平,这样每个列表元素都会有一行自己的行. 我设法用iterrows,dict和append解决它(见下文),但是我的真DF很大. 我可以考虑用另一种格式(可能是分层df?)替换每个元素的列,如果这更有意义的话. 编辑:我有很多专栏,有些可能会在未来发生变化.我唯一知道的是我有字段列.这就是我在我的解决方案中使用dict的原因 一个最小的例子,创建一个df来玩: import StringIO df = pd.read_csv(StringIO.StringIO(""" id|name|fields 1|abc|[qq,ww,rr] 2|efg|[zz,xx,rr] """),sep='|') df.fields = df.fields.apply(lambda s: s[1:-1].split(',')) print df 得到的df: id name fields 0 1 abc [qq,rr] 1 2 efg [zz,rr] 我的(慢)解决方案: new_df = pd.DataFrame(index=[],columns=df.columns) for _,i in df.iterrows(): flattened_d = [dict(i.to_dict(),fields=c) for c in i.fields] new_df = new_df.append(flattened_d ) 结果 id name fields 0 1.0 abc qq 1 1.0 abc ww 2 1.0 abc rr 0 2.0 efg zz 1 2.0 efg xx 2 2.0 efg rr 解决方法
您可以通过将pandas.Series应用于字段然后合并到id和name来将fields列中的列表分成多个列,如下所示:
cols = df.columns[df.columns != 'fields'].tolist() # adapted from @jezrael df = df[cols].join(df.fields.apply(pandas.Series)) 然后,您可以使用set_index和stack来融合生成的新列,然后重置索引: df = df.set_index(cols).stack().reset_index() 最后,删除reset_index生成的冗余列,并将生成的列重命名为“field”: df = df.drop(df.columns[-2],axis=1).rename(columns={0: 'field'}) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |