首页 > 解决方案 > Pandas 标记位于两个不同列之间的列的所有行

问题描述

我有一个包含 3 列的熊猫数据框:

  1. 开始
  2. 结尾
  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

标签: python-3.xpandasdataframe

解决方案


尝试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

推荐阅读