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

标签 python list pandas dataframe

假设我有以下 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/

相关文章:

r - 基于行号矩阵对数据帧进行子集化,并将结果保存在一个列表中

python - 如何更改子图中线条的颜色?

python - Pandas/Scipy中的具体插值方法

python - Python 中的“Zip”列表字典

python - 如何单击链接列表中的每个链接? -Python、 Selenium

objective-c - Cocoa/Objective-C 中有类似通用列表的东西吗?

python - 在 pandas DataFrame 中保留每组的最后 N 条记录

python - 是否可以通过Python获取页面排名等信息?

python - 如何使用scrapy抓取需要登录的网站?

r - 将值向量附加到 R 中的键值列表