python-3.x - Pandas 标记位于两个不同列之间的列的所有行
问题描述
我有一个包含 3 列的熊猫数据框:
- 开始
- 结尾
- 继续
我正在尝试做的事情:
基于开始标志和结束标志列,我需要将 1 应用于继续标志列中的中间值。
我做了什么:
我尝试通过迭代开始列并从下一个索引中找到第一次出现的结束列,并使用索引将 1 应用于继续。
问题:
但是由于我在容器循环中使用了传统的 for,它非常慢,而且我有一个庞大的数据集。
df.apply ()可能吗?
下面是示例输入和我的代码。
输入代码:
import pandas as pd
dataset = pd.DataFrame({'START': [0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0],
'END': [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1] ,
'CONTINUE': [0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0]
})
我的代码:
import pandas as pd
dataset = pd.DataFrame({'START': [0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0],
'END': [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1] ,
'CONTINUE': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
})
for first in dataset[dataset['START'] == 1].index.values:
last = dataset.loc[first+1:,'END'][dataset.loc[first+1:,'END'] == 1].index.values[0]
dataset.loc[first+1:last-1, 'CONTINUE'] = 1
视觉输入代表:
START END CONTINUE
0 0 0 0
1 1 0 0
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0
6 1 1 0
7 0 0 0
8 0 0 0
9 0 1 0
10 0 0 0
11 1 0 0
12 0 0 0
13 0 0 0
14 0 1 0
预期输出代表:
START END CONTINUE
0 0 0 0
1 1 0 0
2 0 0 1
3 0 0 1
4 0 0 1
5 0 0 1
6 1 1 0
7 0 0 1
8 0 0 1
9 0 1 0
10 0 0 0
11 1 0 0
12 0 0 1
13 0 0 1
14 0 1 0
解决方案
尝试cumsum
df['CONTINUE']=(df.START.cumsum()-df.END.cumsum())-df.START
df
Out[96]:
START END CONTINUE
0 0 0 0
1 1 0 0
2 0 0 1
3 0 0 1
4 0 0 1
5 0 0 1
6 1 1 0
7 0 0 1
8 0 0 1
9 0 1 0
10 0 0 0
11 1 0 0
12 0 0 1
13 0 0 1
14 0 1 0
推荐阅读
- javascript - React (Material UI) - 带开关的 MakeStyles
- android - 为什么在使用 altBeacon android 时会调用两次 didRangeBeaconsInRegion?
- vue.js - 在 8base 上一次查询删除多条记录
- python - 计算具有给定边界的数学公式的值范围
- llvm - 如何将控制流图转换回其源代码?例如,C/C++
- python - 在 django 项目中使用 manage.py shell 是否合理?我正在创建一个博客应用程序
- javascript - 如何创建多个动态下拉列表,从同一个数组中获取值,而无需更改 Javascript 中的其他值
- flutter - Flutter - FAILURE:构建失败并出现异常
- php - WC()->cart->add_to_cart 问题在这里?
- swift - SwiftUI 限制更改 TabView 视图的拖动手势