【问题标题】:Create column that flags where another column has condition days ago创建列以标记另一列在几天前具有条件的位置
【发布时间】:2021-11-02 17:18:53
【问题描述】:

我正在使用一个数据框,我需要在其中创建一个按“ColA”分组的列(“Newcol”),然后对于每一行 - 相对于日期列(“ColB”)...。请参阅如果在该日期值之前 2 或 3 天前存在特定字符串。示例如下:

原始 DF:

 ColA     ColB         ColC
  B      2021-10-24    dog
  B      2021-10-25    cat
  B      2021-10-26    bird
  B      2021-10-27    dog
  B      2021-10-28    bird
  H      2021-10-24    cat
  H      2021-10-25    dog
  H      2021-10-26    dog
  H      2021-10-27    bird
  H      2021-10-28    cat
  X      2021-10-24    bird
  X      2021-10-25    dog
  X      2021-10-26    dog
  X      2021-10-27    dog
  X      2021-10-28    bird

所以,假设要标记的字符串是“狗”。按 ColA 分组,我需要“NewCol”才能使用 ColB 日期列,回顾 2-3 天,看看 ColC 是否说“狗”……如果确实如此,则标记它。所以“NewCol”中的值是二进制的:0 表示否,1 表示是。见下例:

所需的 DF:

 ColA     ColB         ColC     NewCol
  B      2021-10-24    dog        NA
  B      2021-10-25    cat        NA
  B      2021-10-26    bird       1
  B      2021-10-27    dog        1
  B      2021-10-28    bird       0
  H      2021-10-24    cat        NA
  H      2021-10-25    dog        NA
  H      2021-10-26    dog        0
  H      2021-10-27    bird       1
  H      2021-10-28    cat        1
  X      2021-10-24    bird       NA
  X      2021-10-25    dog        NA
  X      2021-10-26    dog        0
  X      2021-10-27    dog        1
  X      2021-10-28    bird       1

感谢任何建议。谢谢。

【问题讨论】:

  • 为什么B的最后一行是0
  • @QuangHoang B 的最后一行是日期 = 2021-10-28,因此将查看(2021-10-25 和 2021-10-26)前 2-3 天的 ColC 值colC - 分别是 'cat' 和 'bird' ...在 NewCol 中应该产生 0
  • 啊,我明白了。那么我认为我的解决方案不能回答你的问题。它调查了最后 3 天。

标签: python pandas dataframe


【解决方案1】:

尝试 groupby.rolling:

df['NewCol'] = (df['ColC'].eq('dog')
                 .groupby(df['ColA']).rolling(3).max()
                 .reset_index('ColA', drop=True)
               )

请注意,这仅适用于 ColB 已排序且连续。否则,您需要将ColB 设置为索引并使用'3D' 滚动。

【讨论】:

    【解决方案2】:

    自连接获取带有日期的新列

    extended_df = DF.merge( DF.rename(columns={'ColB':'ColDate'}), on=['ColA', 'ColC'], how='left']
    

    并根据条件定义新列

    extended_df['NewCol'] = np.nan 
    
    extended_df.loc[ (extended_df.colB - extended_df.ColDate)>=2 & \
                     (extended_df.colB - extended_df.ColDate)<=3 , \
                     'NewCol' ] = 1
    
    extended_df.loc[ (extended_df.colB - extended_df.ColDate)<2 | \
                     (extended_df.colB - extended_df.ColDate)>3 , \
                     'NewCol' ] = 0
    

    然后去掉添加的列,得到最终输出

    df = extended_df.drop( 'ColDate', axis=1 )
    del extended_df
    

    【讨论】:

      猜你喜欢
      • 2022-07-28
      • 2020-07-07
      • 2021-03-02
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      相关资源
      最近更新 更多