Python 使用apply get ValueError解压列表的许多列:如果使用所有标量值,则必须传递索引
我想把列表的多列解压成更多的列。基本上,但用于列表的多列,而不是一列,并避免for循环 例如,我有一个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' +
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)]
或者,您可以沿着轴=1concat
:
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