加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何有效地扩展/展平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'})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读