为了账号安全,请及时绑定邮箱和手机立即绑定

根据日期列和日期范围填充 Pandas 数据框

根据日期列和日期范围填充 Pandas 数据框

潇湘沐 2024-01-27 15:08:32
我有一个看起来像这样的 pandas 数据框,    id     start    end0   1   2020-02-01  2020-04-011   2   2020-04-01  2020-04-28我有两个附加参数,它们是日期值,例如 x 和 y。x 和 y 将始终是该月的第一天。我想将上面的数据框扩展到下面所示的 x =“2020-01-01”和 y =“2020-06-01”,    id  month   status0   1   2020-01 -11   1   2020-02 12   1   2020-03 23   1   2020-04 24   1   2020-05 -15   1   2020-06 -16   2   2020-01 -17   2   2020-02 -18   2   2020-03 -19   2   2020-04 110  2   2020-05 -111  2   2020-06 -1数据框已扩展,因此对于每个 id,都会有额外的 Month_ Between(x, y) 行。并创建一个状态列并填充值,以便,如果月份列值等于开始列的月份,则将状态填充为 1如果月份列值大于开始列的月份但小于或等于结束列的月份,则填写为 2。如果月份列值小于起始月份,则填写为-1。另外,如果月份列值大于结束月份,则填充状态为 -1。我试图在 pandas 中解决这个问题而不循环。我当前的解决方案是使用循环,并且需要更长的时间来运行巨大的数据集。有没有熊猫函数可以帮助我?
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

确保start和end列的类型为Timestamp:


# Explode each month between x and y

x = '2020-01-01'

y = '2020-06-01'


df['month'] = [pd.date_range(x, y, freq='MS')] * len(df)

df = df.explode('month').drop_duplicate(['id', 'month'])


# Determine the status

df['status'] = -1


cond = df['start'] == df['month']

df.loc[cond, 'status'] = 1


cond = (df['start'] < df['month']) & (df['month'] <= df['end'])

df.loc[cond, 'status'] = 2


查看完整回答
反对 回复 2024-01-27
  • 1 回答
  • 0 关注
  • 33 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信