python - 为每个 id 分区添加下个月的开始

标签 python pandas datetime pandas-groupby

我正在尝试向我的 Pandas 数据框中添加一个名为 rev_month 的新列。 该列应该是前一行中的值的迭代加法。 first_date 列是 datetime64[ns]

这是输入:

id    first_date             revenue_month_number   
1     2020-12-30 15:14:49    1                      
2     2021-03-01 01:36:23    1                     
2     2021-03-01 01:36:23    2
2     2021-03-01 01:36:23    3                      
3     2021-03-02 19:13:56    1                      
3     2021-03-02 19:13:56    2                     
3     2021-03-02 19:13:56    3                       
3     2021-03-02 19:13:56    4                      
3     2021-03-02 19:13:56    5                       

rev_month 列(按 id 迭代)应始终从 first_date 获取 revenue_month_number 的月初> == 1,并为后续的 Revenue_month_numbers 添加一个(月初)月份值。

期望的输出:

id    first_date             revenue_month_number    rev_month
1     2020-12-30 15:14:49    1                       2020-12-01
2     2021-03-01 01:36:23    1                       2021-03-01
2     2021-03-01 01:36:23    2                       2021-04-01
2     2021-03-01 01:36:23    3                       2021-05-01
3     2021-03-02 19:13:56    1                       2021-03-01
3     2021-03-02 19:13:56    2                       2021-04-01
3     2021-03-02 19:13:56    3                       2021-05-01
3     2021-03-02 19:13:56    4                       2021-06-01
3     2021-03-02 19:13:56    5                       2021-07-01

我尝试了多种方法,但似乎无法成功。

如果有人提出建议,我将不胜感激!

数据框可以通过以下方式重现:

data = {'first_date': ['2020-12-30 15:14:49', '2021-03-01 01:36:23', '2021-03-01 01:36:23',
                       '2021-03-01 01:36:23', '2021-03-02 19:13:56', '2021-03-02 19:13:56',                  
                        '2021-03-02 19:13:56', '2021-03-02 19:13:56', '2021-03-02 19:13:56'],
        'revenue_month_number': [1,1,2,3,1,2,3,4,5]}
df = pd.DataFrame.from_dict(data)
df['first_date'] = pd.to_datetime(df['first_date'])

最佳答案

让我们尝试一下偏移

df['new'] = df.apply(lambda x: x['first_date'] + pd.offsets.MonthEnd(x['revenue_month_number']) +pd.offsets.MonthBegin(-1) , axis=1)
df
Out[43]: 
   id first_date  revenue_month_number        new
0   1 2020-12-30                     1 2020-12-01
1   2 2021-03-01                     1 2021-03-01
2   2 2021-03-01                     2 2021-04-01
3   2 2021-03-01                     3 2021-05-01
4   3 2021-03-02                     1 2021-03-01
5   3 2021-03-02                     2 2021-04-01
6   3 2021-03-02                     3 2021-05-01
7   3 2021-03-02                     4 2021-06-01
8   3 2021-03-02                     5 2021-07-01

关于python - 为每个 id 分区添加下个月的开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67535540/

相关文章:

python - 如何对不同上下文的查询使用序列标签?

python - 当模式出现在另一列中时更改两列的值

python - 以 AM/PM 格式绘制 Pandas Datetime 时间序列

python - 如何将API时间戳转换为python日期时间对象

python - Tkinter:如何使用线程来防止主事件循环 "freezing"

python - 在 Python 中计算具有特定扩展名的文件数

python - 如何修改pandas数据框多重索引的0级?

python - 根据 Pandas 列中的列表值从 DataFrame 中选择行

python - 减去存储在两个单独列表中的 datetime.time 对象

python - 检测字符串中的 URL 并用 "<a href..."标记包装