python - 将列表项拆分为单独的列 - 熊猫数据框
问题描述
我有一个看起来像这样的初始熊猫数据框 - 每个单元格都是 初始输入值的列表
Python 脚本 - 获取初始数据帧 - 就像 Ian Thompson 在这个答案中提到的那样 -
import pandas as pd
df_out1 = pd.DataFrame({
0: [
[None, 'A', 'B', 'C', 'D'],
[None, 'A1', 'B1', 'C1', 'D1'],
[None, 'A2', 'B2', 'C2', 'D2'],
],
1: [
[None] * 5,
[None] * 5,
[None] * 5,
],
2: [
['V', 'W', 'X', 'Y', 'Z'],
['V1', 'W1', 'X1', 'Y1', 'Z1'],
['V2', 'W2', 'X2', 'Y2', 'Z2'],
]
})
我想像这样格式化它 - 对于每一行 - 列表的每个项目都形成一列,并对所有重复/迭代执行此操作 - 所需的输出
我的原始输入数据集非常庞大 - 10,000 行和 40 列。我在 python 脚本下执行 - 虽然它正在工作并提供所需的输出 - 当我运行 2000 行和 40 列时 - 运行时间接近 1800 秒,我认为这是更高的一面。
Python 脚本:df_out1 是初始数据帧
d = pd.DataFrame()
for x in range(len(df_out1)):
for y in range(len(df_out1.columns)):
d = d.append(pd.Series(df_out1[y][x]), ignore_index=True)
d.to_csv('inter_alm_output_' + str(time.strftime("%Y%m%d-%H%M%S")) + '.csv')
有没有办法在更短的时间内实现这一目标,换句话说,优化它?
解决方案
如果这是您的起始数据框:
df = pd.DataFrame({
0 : [
[None, 'A', 'B', 'C', 'D'],
[None, 'A1', 'B1', 'C1', 'D1'],
[None, 'A2', 'B2', 'C2', 'D2'],
],
1 : [
[None]*5,
[None]*5,
[None]*5,
],
2 : [
['V', 'W', 'X', 'Y', 'Z'],
['V1', 'W1', 'X1', 'Y1', 'Z1'],
['V2', 'W2', 'X2', 'Y2', 'Z2'],
]
})
pd.Series
您可以通过应用和连接结果来重新格式化列。
print(pd.concat([
df[i].apply(pd.Series) for i in df.columns
]).sort_index().reset_index(drop=True))
0 1 2 3 4
0 None A B C D
1 None None None None None
2 V W X Y Z
3 None A1 B1 C1 D1
4 None None None None None
5 V1 W1 X1 Y1 Z1
6 None A2 B2 C2 D2
7 None None None None None
8 V2 W2 X2 Y2 Z2
另一种不使用的方法pd.concat
:
print(df.stack().reset_index(drop=True).apply(pd.Series))
0 1 2 3 4
0 None A B C D
1 None None None None None
2 V W X Y Z
3 None A1 B1 C1 D1
4 None None None None None
5 V1 W1 X1 Y1 Z1
6 None A2 B2 C2 D2
7 None None None None None
8 V2 W2 X2 Y2 Z2
第一种方法在
3.93 ms ± 154 µs per loop (mean ± std. dev. of 7 runs, 100 loops each
第二种方法完成
2.34 ms ± 66.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
您的原始代码在
15 ms ± 340 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
推荐阅读
- maven - 意外标记
maven-publish
我正在尝试通过插件在 Maven 上发布我的 Gradle 项目。我将我的 Gradle 脚本设置如下
build.gradle.kts
- django - 同一模型中的多个(相同)多对一关系
- amazon-web-services - 是否可以构建一个聊天机器人来从 DynamoDB 表中查询数据?
- scala - Scala 未来和两种转换
- docker - Docker 映像未使用 https 和 tomcat 运行
- javascript - 更改跨度的文本内容
- python - 你可以移动图像的矩形中心吗?
- dns - 您何时会选择 Route 53 Alias 而不是 CNAME?
- postgresql - 将栅格导入到 postgis,raster2pgsql 错误
- python - 龙卷风中 Flask API 的替代品(Dialogflow webhook)