Pandas DataFrame 列表列去嵌套的终极指南

时间:2024-12-30 19:39 分类:其他教程

在数据处理的海洋中,Pandas 无疑是我们最强大的船只。然而,当我们面对 DataFrame 中那些令人头疼的列表列时,即使是最老练的水手也会感到困惑。今天,我们将深入探讨如何将这些列表列“爆炸”成独立的行,为您的数据分析之旅扫清障碍。

方法一:DataFrame.explode() - 最简便的爆炸

自 Pandas 0.25 版本以来,explode() 方法成为了处理列表列的利器。假设我们有一个 DataFrame df,其中包含列 'A' 和 'B',后者是列表:

df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [3, 4]]})
df_exploded = df.explode('B')

这行代码将每个列表元素转换为单独的行,简单而直接。

方法二:Series 的艺术

如果您偏爱传统,可以通过 Series 来实现:

df_exploded = df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})

这种方法通过将 'A' 设为索引,然后将 'B' 列的每个元素转换为 Series,最后堆叠和重置索引,达到去嵌套的效果。

方法三:DataFrame 的重复

重复 DataFrame 的行,然后分配新的 'B' 值:

df_exploded = pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)})

这里,我们利用 repeat 方法重复 'A' 列的行数,然后用 np.concatenate 合并 'B' 列的列表。

方法四:Reindex 和 Loc 的魔力

df_exploded = df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))

通过重新索引和分配新值,这种方法同样能达到目的。

方法五:ChainMap 的巧妙应用

from collections import ChainMap
d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A'])))
df_exploded = pd.DataFrame(list(d.items()),columns=df.columns[::-1])

ChainMap 提供了一种独特的视角,将列表转换为字典,然后再转回 DataFrame。

方法六:Numpy 的效率

newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
df_exploded = pd.DataFrame(data=newvalues[0],columns=df.columns)

Numpy 的高效计算在这里发挥了作用,通过堆叠和重复操作,快速处理数据。

方法七:迭代器的循环之美

from itertools import cycle,chain
l=df.values.tolist()
l1=[list(zip([x[0]], cycle(x[1])) if len([x[0]]) > len(x[1]) else list(zip(cycle([x[0]]), x[1]))) for x in l]
df_exploded = pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)

迭代器的使用让代码变得更加灵活和有趣,通过循环和链式操作,实现了列表的去嵌套。

多列的泛化

当面对多列嵌套时,我们可以定义一个函数来处理:

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx
    return df1.join(df.drop(explode, 1), how='left')

这个函数可以处理多个列的嵌套问题,灵活而强大。

结论

无论您是数据科学的新手还是老手,掌握这些方法将使您在处理 Pandas DataFrame 时更加得心应手。每个方法都有其独特的魅力和适用场景,选择适合您的数据和需求的方法,让您的分析之旅更加顺畅。

通过这些技巧,您的数据处理将不再是单调的重复,而是充满了创造性和效率的探索。记住,数据分析的艺术在于如何巧妙地利用工具,让数据为您所用。继续关注 PHP 中文网,获取更多数据处理的技巧和方法,让您的技能更上一层楼!

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告