Python 如何基于上述行添加新列';s值

Python 如何基于上述行添加新列';s值,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据帧,如下所示。首先,它们有三列(“日期”、“时间”、“标志”)。我想添加一个基于标志和日期的列,这意味着当我得到标志=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时,这一天的剩余时间目标为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
用于累计总和
标志
值,与
0
和最后一次转换掩码进行比较,以
整数

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

好吧,我知道我们已经找到了一个解决方案,但为了满足我的书呆子,这里有一个答案(考虑到它的长度,这个答案并不优雅)来避免第一排的缺陷

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

方法与@jezrael相同-groupby函数是这里的关键。与使用导致第一行缺陷的cumsum不同,
any()
似乎非常适合此解决方案。唯一的缺点是它会产生一个系列,然后我们需要强制将其返回到数据帧并进行转置,然后再通过日期键将它们连接在一起。

您是否阅读:@knh190我认为您应该更好地阅读该问题。这并不像你所链接的那么简单,只是奇妙地使用了
True
1
实现Python固有的解释性设计决策,以及几乎随意地使用了
groupby
固有的升序排序。但是,如果时间还没有安排好,可能会出问题。:)@ycx-谢谢:)很好@jezrael:-)另一个选择是在这里使用
gt(0)
,太好了solution@yatu-谢谢。@jezrael是的,如果日期相同,只需再添加一行,根据第二行中的值回填第一行