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

时间:2019-01-17 08:00:35

标签: python pandas

我有一个数据帧,如下所示。首先,它们具有三列'Parse/PFFile.h' file not found 。我想添加一列基于标志和日期的列,这意味着当我第一天在第一天获得find Pods -name PFFile.h 时,此行目标为('date','time','flag'),今天的另一目标为{{1 }}。

flag=1

4 个答案:

答案 0 :(得分:1)

1比较DataFrameGroupBy.cumsum,并用flag1bitwise AND比较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))

另一种解决方案:

np.savetxt(newfolder + '\\' + filename + '.csv', mzplist)

答案 1 :(得分:0)

首先选择每个日期的flag = 1的头一个记录,并将目标设置为1

df1 = df[df.flag==1].groupby("date").head(1);
df1.target = 1

然后将原始数据帧的目标重置为0,并用新创建的数据帧替换目标值,仅对于在第一个数据帧中选择的那些记录,将目标值重置为1。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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