python - 使用 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'
解决方案
如果您不介意更改apply
,explode
那么这是一种解决方案。氪。
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
推荐阅读
- github - electron.exe 和 Github
- c# - 使用 .Local 和 new 构造函数有效地删除 EF 实体而不检索查询
- python - 如何使代码在 text.split 之后不打印两次单词
- swift - 获取包含在字符串和数组中的短语列表
- python - 将scrapy json导出读入python
- windows - 尝试在 Windows 上的 Anaconda 上下载 GraphViz
- javascript - 解析可能包含或不包含年份的 JavaScript 日期字符串
- java - 如何使用 @patch 使用 jpa 存储库更新单个字段
- arrays - 如何在一个单元格中减去 2 个数组并求和?
- html - 浮动问题。试图带走浮子,但它不起作用