python - 使用 period_range 在 Pandas DataFrame 中生成新行

标签 python pandas dataframe

我想使用开始日期和月数从数据框中生成新行。请参阅下面的示例 DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({'ID': ['a', 'b'],
                   'start': ['5/6/2021', '5/20/2021'], 
                   'periods': [1, 12],
                   'MRR': [400, 380]})

df
<表类=“s-表”> <标题> ID 开始 句点 MRR <正文> a 2021 年 5 月 6 日 1 400 b 2021 年 5 月 20 日 12 380

理想情况下,我会使用 pd.period_range与下面的示例类似,但不确定如何应用于 DataFrame/Columns:

prd = pd.period_range(df.loc[0,'start'], periods=12, freq='M')
prd = pd.Series(1, prd)
prd

2021-05    1
2021-06    1
2021-07    1
2021-08    1
2021-09    1
2021-10    1
2021-11    1
2021-12    1
2022-01    1
2022-02    1
2022-03    1
2022-04    1

无论哪种方式,生成的 DataFrame 都会如下所示:

<表类=“s-表”> <标题> ID 开始 句点 MRR <正文> a 2021 年 5 月 6 日 1 400 b 2021 年 5 月 20 日 12 380 b 2021 年 6 月 20 日 12 380 b 2021 年 7 月 20 日 12 380 b 2021 年 8 月 20 日 12 380 b 2021 年 9 月 20 日 12 380 b 2021 年 10 月 20 日 12 380 b 2021 年 11 月 20 日 12 380 b 2021 年 12 月 20 日 12 380 b 2022 年 1 月 20 日 12 380 b 2022 年 2 月 20 日 12 380 b 2022 年 3 月 20 日 12 380 b 2022 年 4 月 20 日 12 380

最佳答案

尝试创建 MultiIndex.from_frame使用 startperiods 值创建范围:

midx = pd.MultiIndex.from_frame(
    df.set_index('ID')
        .apply(
        lambda r: pd.period_range(r['start'], periods=r['periods'], freq='M'),
        axis=1)
        .explode()
        .reset_index(),
    names=['ID', 'start']
)
MultiIndex([('a', '2021-05'),
            ('b', '2021-05'),
            ('b', '2021-06'),
            ('b', '2021-07'),
            ('b', '2021-08'),
            ('b', '2021-09'),
            ('b', '2021-10'),
            ('b', '2021-11'),
            ('b', '2021-12'),
            ('b', '2022-01'),
            ('b', '2022-02'),
            ('b', '2022-03'),
            ('b', '2022-04')],
           names=['ID', 'start'])

使用 asfreqstart 转换为每月然后set_index + reindex使用多重索引:

df['start'] = df['start'].asfreq('M')
df = df.set_index(['ID', 'start']).reindex(midx).reset_index()

df:

   ID    start  periods  MRR
0   a  2021-05        1  400
1   b  2021-05       12  380
2   b  2021-06       12  380
3   b  2021-07       12  380
4   b  2021-08       12  380
5   b  2021-09       12  380
6   b  2021-10       12  380
7   b  2021-11       12  380
8   b  2021-12       12  380
9   b  2022-01       12  380
10  b  2022-02       12  380
11  b  2022-03       12  380
12  b  2022-04       12  380

关于python - 使用 period_range 在 Pandas DataFrame 中生成新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67909039/

相关文章:

python - Pandas : Get the least number of records so all columns have at least one non null value

python - pandas dataframe from_dict - 为键设置列名,为键值设置列名

python - 如何计算批处理数据帧的平均值?

python - 将具有最接近值的列添加到 PySpark Dataframe

Python 与空闲进程的进程间通信

python - 条件检查序列

python - 在 Pandas 中理解就地=真

r - 计算数据框中自开始以来的月数

python - Visual Studio PyTools 从现有代码创建 Django 项目

python - 如何使用 View (numpy)将二维数组转换为结构化数组?