猿问

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

我有一个看起来像这样的 pandas 数据框,


    id     start    end

0   1   2020-02-01  2020-04-01

1   2   2020-04-01  2020-04-28

我有两个附加参数,它们是日期值,例如 x 和 y。x 和 y 将始终是该月的第一天。


我想将上面的数据框扩展到下面所示的 x =“2020-01-01”和 y =“2020-06-01”,


    id  month   status

0   1   2020-01 -1

1   1   2020-02 1

2   1   2020-03 2

3   1   2020-04 2

4   1   2020-05 -1

5   1   2020-06 -1

6   2   2020-01 -1

7   2   2020-02 -1

8   2   2020-03 -1

9   2   2020-04 1

10  2   2020-05 -1

11  2   2020-06 -1

数据框已扩展,因此对于每个 id,都会有额外的 Month_ Between(x, y) 行。并创建一个状态列并填充值,以便,

  • 如果月份列值等于开始列的月份,则将状态填充为 1

  • 如果月份列值大于开始列的月份但小于或等于结束列的月份,则填写为 2。

  • 如果月份列值小于起始月份,则填写为-1。另外,如果月份列值大于结束月份,则填充状态为 -1。

我试图在 pandas 中解决这个问题而不循环。我当前的解决方案是使用循环,并且需要更长的时间来运行巨大的数据集。

有没有熊猫函数可以帮助我?


潇湘沐
浏览 93回答 1
1回答

蝴蝶刀刀

确保start和end列的类型为Timestamp:# Explode each month between x and yx = '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 statusdf['status'] = -1cond = df['start'] == df['month']df.loc[cond, 'status'] = 1cond = (df['start'] < df['month']) & (df['month'] <= df['end'])df.loc[cond, 'status'] = 2
随时随地看视频慕课网APP

相关分类

Python
我要回答