Python 根据具有相同日期的多行添加新列

Python 根据具有相同日期的多行添加新列,python,pandas,Python,Pandas,我有一个数据帧,如下所示。首先,它们有三列('date','time','flag')。我想添加一个基于标志和日期的列,这意味着当我首先在一天内获得flag=1时,那么此行目标是1,这一天的另一个目标是0 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 0 3 2017/4/10

我有一个数据帧,如下所示。首先,它们有三列
('date','time','flag')
。我想添加一个基于标志和日期的列,这意味着当我首先在一天内获得
flag=1
时,那么此行目标是
1
,这一天的另一个目标是
0

  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     0
3 2017/4/10   13:00:00  0     0
4 2017/4/10   14:00:00  0     0
5 2017/4/11   10:00:00  1     1
6 2017/4/11   11:00:00  0     0
7 2017/4/11   12:00:00  1     0
8 2017/4/11   13:00:00  1     0
9 2017/4/11   14:00:00  0     0
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     0
18 2017/4/13  13:00:00  1     0
19 2017/4/13  14:00:00  0     0

首先为每个日期选择标记为1的top First记录,并将目标设置为1

df1 = df[df.flag==1].groupby("date").head(1);
df1.target = 1
然后,将原始数据帧的目标值重置为0,并用新创建的数据帧替换目标值,目标值仅为第一个数据帧中选择的记录的1

df.target = 0
df.update(df1.target)

这是易于理解和使用的答案:

m=f[['date','flag']]
i=m[m.flag==1].drop_duplicates().index
f['target']=0
f['target'].iloc[i]=1
print(f.drop(columns={'index'})
输出:

         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       0
3   2017/4/10  13:00:00     0       0
4   2017/4/10  14:00:00     0       0
5   2017/4/11  10:00:00     1       1
6   2017/4/11  11:00:00     0       0
7   2017/4/11  12:00:00     1       0
8   2017/4/11  13:00:00     1       0
9   2017/4/11  14:00:00     0       0
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       0
18  2017/4/13  13:00:00     1       0
19  2017/4/13  14:00:00     0       0
通过
1
和链编码比较
flag
by
1
按位和
并转换为整数:

df['target1'] = (df.groupby('date')['flag'].cumsum().eq(1) & df['flag'].eq(1)).astype(int)
         date      time  flag  target  target1
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       0        0
3   2017/4/10  13:00:00     0       0        0
4   2017/4/10  14:00:00     0       0        0
5   2017/4/11  10:00:00     1       1        1
6   2017/4/11  11:00:00     0       0        0
7   2017/4/11  12:00:00     1       0        0
8   2017/4/11  13:00:00     1       0        0
9   2017/4/11  14:00:00     0       0        0
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       0        0
18  2017/4/13  13:00:00     1       0        0
19  2017/4/13  14:00:00     0       0        0
另一个解决方案:

df['target1'] = ((~df.loc[df['flag']==1, 'date'].duplicated())
                     .reindex(df.index, fill_value=False).astype(int))
Oneliner:

# Assuming your `df` doesn't have target in the first place
df['target'] = 0
df.loc[df[df.flag==1].drop_duplicates('date').index, 'target'] = 1

我想你想用熊猫。。。