如何根据上述行的值添加新列

时间:2019-01-10 09:12:24

标签: python pandas dataframe pandas-groupby

我有一个数据框,如下所示。首先,它们具有三列(“日期”,“时间”,“标志”)。我想基于标志和日期添加一列,这意味着当我获得flag = 1时,那么今天剩下的目标是1,否则目标是零。

  date        time      flag  target
0 2017/4/10   10:00:00  0     0
1 2017/4/10   11:00:00  1     1
2 2017/4/10   12:00:00  0     1
3 2017/4/10   13:00:00  0     1
4 2017/4/10   14:00:00  0     1
5 2017/4/11   10:00:00  1     1
6 2017/4/11   11:00:00  0     1
7 2017/4/11   12:00:00  1     1
8 2017/4/11   13:00:00  1     1
9 2017/4/11   14:00:00  0     1
10 2017/4/12  10:00:00  0     0
11 2017/4/12  11:00:00  0     0
12 2017/4/12  12:00:00  0     0
13 2017/4/12  13:00:00  0     0
14 2017/4/12  14:00:00  0     0
15 2017/4/13  10:00:00  0     0
16 2017/4/13  11:00:00  1     1
17 2017/4/13  12:00:00  0     1
18 2017/4/13  13:00:00  1     1
19 2017/4/13  14:00:00  0     1

2 个答案:

答案 0 :(得分:3)

使用DataFrameGroupBy.cumsum作为flag的累积总和,与0比较,最后将掩码转换为integer

df['new'] = (df.groupby('date')['flag'].cumsum() > 0).astype(int)
print (df)
         date      time  flag  target  new
0   2017/4/10  10:00:00     0       0    0
1   2017/4/10  11:00:00     1       1    1
2   2017/4/10  12:00:00     0       1    1
3   2017/4/10  13:00:00     0       1    1
4   2017/4/10  14:00:00     0       1    1
5   2017/4/11  10:00:00     1       1    1
6   2017/4/11  11:00:00     0       1    1
7   2017/4/11  12:00:00     1       1    1
8   2017/4/11  13:00:00     1       1    1
9   2017/4/11  14:00:00     0       1    1
10  2017/4/12  10:00:00     0       0    0
11  2017/4/12  11:00:00     0       0    0
12  2017/4/12  12:00:00     0       0    0
13  2017/4/12  13:00:00     0       0    0
14  2017/4/12  14:00:00     0       0    0
15  2017/4/13  10:00:00     0       0    0
16  2017/4/13  11:00:00     1       1    1
17  2017/4/13  12:00:00     0       1    1
18  2017/4/13  13:00:00     1       1    1
19  2017/4/13  14:00:00     0       1    1

答案 1 :(得分:0)

好的,我知道我们已经在这里找到了解决方案,但是只是为了满足我的书呆子,这是一个避免麻烦的答案(考虑到要花多长时间,这不是很优雅)

pd.merge(df, (df.groupby('date')['flag'].any().astype(int)).to_frame().T.transpose().reset_index(), left_on='date', right_on='date')

方法仍然与@jezrael相同-这里的groupby函数是关键。 any()并没有使用导致第一行缺陷的累积量,而是非常适合此解决方案。唯一的缺点是它将产生一个序列,然后我们需要将其强制转换为数据框并转置,然后再通过 date 键将它们连接在一起。