首页 > 解决方案 > 使用 apply get ValueError 解包多列列表:如果使用所有标量值,则必须传递索引

问题描述

我想将多列列表解压缩成更多列。基本上只是针对多列列表而不仅仅是一列,并且避免了 for 循环。

例如,我有一个pandas.DataFrame

import pandas as pd

tst = pd.DataFrame({'A': [[1, 2]]* 5, 'B': [[3, 4]]* 5, 'C': [[5, 6]] * 5})

我可以轻松地将其中一列拆包,例如A分成多列,

pd.DataFrame(tst['A'].to_list(), 
             columns=['1' + tst['A'].name, '2' + tst['A'].name],
             index=list(range(tst['A'].shape[0]))
            )

但是,当我尝试使用.apply避免 for 循环将其扩展到多列时,

tst.apply(
    lambda x: pd.DataFrame(x.to_list(), 
                           columns=['1' + x.name, '2' + x.name], 
                           index=list(range(x.shape[0]))
                          )
)

我收到以下错误,但是我提供了一个index...

ValueError: If using all scalar values, you must pass an index

有没有办法解决这个问题,以便我得到如下输出?(列顺序无关紧要)

    1C  2C  1B  2B  1A  2A
0   5   6   3   4   1   2
1   5   6   3   4   1   2
2   5   6   3   4   1   2
3   5   6   3   4   1   2
4   5   6   3   4   1   2

pd.__version__ == '1.0.5'

标签: pythonpandaspandas-apply

解决方案


如果您不介意更改applyexplode那么这是一种解决方案。氪。

res=pd.concat([pd.DataFrame(tst[[x]].explode(x).values.reshape(-1,2), columns=['1' + x, '2' + x]) for x in tst.columns], 1)
print(res)

返回:

  1A 2A 1B 2B 1C 2C
0  1  2  3  4  5  6
1  1  2  3  4  5  6
2  1  2  3  4  5  6
3  1  2  3  4  5  6
4  1  2  3  4  5  6

推荐阅读