gpt4 book ai didi

python - "unstack"包含多行列表的 pandas 列

转载 作者:太空宇宙 更新时间:2023-11-03 21:45:45 27 4
gpt4 key购买 nike

假设我有以下 Pandas 数据框:

df = pd.DataFrame({"a" : [1,2,3], "b" : [[1,2],[2,3,4],[5]]})
a b
0 1 [1, 2]
1 2 [2, 3, 4]
2 3 [5]

我如何“取消堆叠”“b”列中的列表,以便将其转换为数据帧:

   a  b
0 1 1
1 1 2
2 2 2
3 2 3
4 2 4
5 3 5

最佳答案

从Pandas 0.25.0开始,有内部方法DataFrame.explode() ,它就是为此而设计的:

res = df.explode("b")

输出

In [98]: res
Out[98]:
a b
0 1 1
0 1 2
1 2 2
1 2 3
1 2 4
2 3 5
<小时/>

Pandas 版本 < 0.25 的解决方案:通用矢量化方法 - 也适用于多列 DF:

假设我们有以下 DF:

In [159]: df
Out[159]:
a b c
0 1 [1, 2] 5
1 2 [2, 3, 4] 6
2 3 [5] 7

解决方案:

In [160]: lst_col = 'b'

In [161]: pd.DataFrame({
...: col:np.repeat(df[col].values, df[lst_col].str.len())
...: for col in df.columns.difference([lst_col])
...: }).assign(**{lst_col:np.concatenate(df[lst_col].values)})[df.columns.tolist()]
...:
Out[161]:
a b c
0 1 1 5
1 1 2 5
2 2 2 6
3 2 3 6
4 2 4 6
5 3 5 7

设置:

df = pd.DataFrame({
"a" : [1,2,3],
"b" : [[1,2],[2,3,4],[5]],
"c" : [5,6,7]
})

矢量化 NumPy 方法:

In [124]: pd.DataFrame({'a':np.repeat(df.a.values, df.b.str.len()),
'b':np.concatenate(df.b.values)})
Out[124]:
a b
0 1 1
1 1 2
2 2 2
3 2 3
4 2 4
5 3 5

旧答案:

试试这个:

In [89]: df.set_index('a', append=True).b.apply(pd.Series).stack().reset_index(level=[0, 2], drop=True).reset_index()
Out[89]:
a 0
0 1 1.0
1 1 2.0
2 2 2.0
3 2 3.0
4 2 4.0
5 3 5.0

或者更好的解决方案 provided by @Boud :

In [110]: df.set_index('a').b.apply(pd.Series).stack().reset_index(level=-1, drop=True).astype(int).reset_index()
Out[110]:
a 0
0 1 1
1 1 2
2 2 2
3 2 3
4 2 4
5 3 5

关于python - "unstack"包含多行列表的 pandas 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52510915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com