我想使用开始日期和月数从数据框中生成新行。请参阅下面的示例 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
理想情况下,我会使用 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 都会如下所示:
最佳答案
尝试创建 MultiIndex.from_frame
使用 start
和 periods
值创建范围:
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'])
使用 asfreq
将 start
转换为每月然后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/