如何有效地扩展展平pandas数据帧

如何有效地扩展展平pandas数据帧,第1张

概述我有一个数据集,在其中一个列上,每个元素都是一个列表. 我想将它弄平,这样每个列表元素都会有一行自己的行. 我设法用iterrows,dict和append解决它(见下文),但是我的真DF很大. 有没有办法让事情变得更快? 我可以考虑用另一种格式(可能是分层df?)替换每个元素的列,如果这更有意义的话. 编辑:我有很多专栏,有些可能会在未来发生变化.我唯一知道的是我有字段列.这就是我在我的解决方案 我有一个数据集,在其中一个列上,每个元素都是一个列表.
我想将它弄平,这样每个列表元素都会有一行自己的行.

我设法用iterrows,dict和append解决它(见下文),但是我的真DF很大.
有没有办法让事情变得更快?

我可以考虑用另一种格式(可能是分层df?)替换每个元素的列,如果这更有意义的话.

编辑:我有很多专栏,有些可能会在未来发生变化.我唯一知道的是我有字段列.这就是我在我的解决方案中使用dict的原因

一个最小的例子,创建一个df来玩:

import StringIOdf = pd.read_csv(StringIO.StringIO("""ID|name|fIElds1|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        fIElds0   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 fIElds0  1.0  abc     qq1  1.0  abc     ww2  1.0  abc     rr0  2.0  efg     zz1  2.0  efg     xx2  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'})
总结

以上是内存溢出为你收集整理的如何有效地扩展/展平pandas数据帧全部内容,希望文章能够帮你解决如何有效地扩展/展平pandas数据帧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1193852.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存