【问题标题】:how to add new column based on the above row's value如何根据上述行的值添加新列
【发布时间】:2019-01-10 09:12:23
【问题描述】:

我有一个如下的数据框。起初,它们有三列(“日期”、“时间”、“标志”)。我想添加一个基于标志和日期的列,这意味着当我得到 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

【问题讨论】:

标签: python pandas dataframe pandas-groupby


【解决方案1】:

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

【讨论】:

  • 简单地使用 True1 实现 Python 固有的解释性设计决策和几乎随意使用 groupby 固有的升序排序。但是,它可能搞砸的一个可能部分是时间尚未排序。 :)
  • @ycx - 谢谢 :)
  • 不错的@jezrael :-) 另一种选择是在这里使用gt(0),很好的解决方案
  • @yatu - 谢谢。
  • @jezrael 是的,如果日期相同,只需要再添加一行以根据第二行中的值回填第一行
【解决方案2】:

好的,我知道我们已经在这里找到了解决方案,但只是为了满足我的书呆子,这里有一个答案(考虑到它有多长,并不优雅),以避免烦人的第一行缺陷

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() 没有使用导致第一行缺陷的 cumsum,似乎非常适合此解决方案。唯一的缺点是它会产生一个系列,然后我们需要将其强制回一个数据帧并转置,然后再通过 date 键将它们连接在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多