python - 在不使用 for 循环的情况下将值应用于 DataFrame
问题描述
我正在寻找一种更快的方法将值应用于 DataFrame 中的列。该值基于True and False
第一列和第二列中的两个值。这是我目前的解决方案:
df['result'] = df.check1.astype(int)
for i in range(len(df)):
if df.result[i] != 1:
df.result[i] = df.result.shift(1)[i] + df.check2[i].astype(int)
这产生了这个结果:
check1 check2 result
0 True False 1
1 False False 1
2 False False 1
3 False False 1
4 False False 1
5 False False 1
6 False True 2
7 False False 2
8 False True 3
9 False False 3
10 False True 4
11 False False 4
12 False True 5
13 False False 5
14 False True 6
15 False False 6
16 False True 7
17 False False 7
18 False False 7
19 False False 7
20 False True 8
21 False False 8
22 False True 9
23 True False 1
24 False False 1
因此,第三列需要是基于其上方行中的值的数字。如果 check1 为 True,则数字需要返回 1。如果 check2 为 true,则需要将 1 添加到数字。否则数字保持不变。
当前的代码很好,但是因为我需要将它应用到大约有 . 70.000 行。我很确定它可以改进(我猜是使用 apply 函数,但我不确定)。
有任何想法吗?
解决方案
使用pandas.DataFrame.groupby.cumsum
:
import pandas as pd
df['result'] = df.groupby(df['check1'].cumsum())[['check1', 'check2']].cumsum().sum(1)
或@Dan 的建议:
df['result'] = df.groupby(df['check1'].cumsum())['check2'].cumsum().add(1)
输出:
check1 check2 result
0 True False 1.0
1 False False 1.0
2 False False 1.0
3 False False 1.0
4 False False 1.0
5 False False 1.0
6 False True 2.0
7 False False 2.0
8 False True 3.0
9 False False 3.0
10 False True 4.0
11 False False 4.0
12 False True 5.0
13 False False 5.0
14 False True 6.0
15 False False 6.0
16 False True 7.0
17 False False 7.0
18 False False 7.0
19 False False 7.0
20 False True 8.0
21 False False 8.0
22 False True 9.0
23 True False 1.0
24 False False 1.0
推荐阅读
- vtk - 如何将 VTK 结构化点文件转换为 OpenVDB
- database - 颤振 - 在本地访问数据
- spring - 文件上传的Spring Camel Rest路由问题
- excel - OpenXML 工作表单元格值不接受超过 15 个零
- mysql - 如何从 18 个值 SQL 中选择 16 个最高值?
- python - 如何使 kivy 工作?我安装时出错
- c# - 带有 EF Core 迁移的抽象类
- docker - 第一步创建的gitlab神器可以直接在第二步的docker中使用吗
- scala - 寻找适用于 Monad 的一些但不是所有属性的结构的示例
- html - 在移动设备中设置内容堆叠顺序(HTML 电子邮件)