Python 使用apply get ValueError解压列表的许多列:如果使用所有标量值,则必须传递索引

Python 使用apply get ValueError解压列表的许多列:如果使用所有标量值,则必须传递索引,python,pandas,pandas-apply,Python,Pandas,Pandas Apply,我想把列表的多列解压成更多的列。基本上,但用于列表的多列,而不是一列,并避免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' +

我想把列表的多列解压成更多的列。基本上,但用于列表的多列,而不是一列,并避免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]))
                          )
)
我得到以下错误,但是我提供了一个
索引

ValueError: If using all scalar values, you must pass an index
有没有办法解决这个问题,使我得到如下所示的输出?(列顺序无关紧要)


pd.\uu版本\uuu==“1.0.5”

如果您不介意更改
应用到
分解
,则这是一行解决方案。韩元

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

您可以水平
堆叠列,然后创建新数据框并重命名列:

df = pd.DataFrame(np.hstack(tst.values.T.tolist()))
df.columns = [f'{i}{c}' for c in tst for i in range(1,3)]
或者,您可以沿着轴=1
concat

df = pd.concat([pd.DataFrame(tst[c].tolist()) for c in tst], axis=1)
df.columns = [f'{i}{c}' for c in tst for i in range(1,3)]


谢谢,这非常有效-我接受了这个答案,因为对于我的实际
df
,它有许多列/行lists@RK1快乐编码!谢谢这很有效(有点慢),但它似乎适用于
NoneTypes
,这非常有用
df = pd.concat([pd.DataFrame(tst[c].tolist()) for c in tst], axis=1)
df.columns = [f'{i}{c}' for c in tst for i in range(1,3)]
print(df)

   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