如何为12个周期复制数据帧行,并将周期名称添加到每一行?

2024-10-08 20:17:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在提取一个项目列表,只显示项目编号和项目状态。 我现在需要做的是复制这11次,并为一年中的每个月/期间添加一列。 因此,我们将有:

^{tb1}$

等等等等

我已经做到了这一点,但速度非常慢,我刚刚开始学习Python,到目前为止,Python的其他一切似乎都非常快,所以希望有更好的解决方案,这就是我通过猜测工作、尝试和错误以及Google得到的:

"""Repeat df for the 12 months"""
df = pd.concat([df]*12)
df.sort_values(by=['Project'])
data = df
data.sort_index(inplace=True)
data.reset_index(inplace=True)
df = data

"""Add the 12 periods to df"""
for project in df['Project']:
    periodIndexNames = df[(df['Project'].str.fullmatch(project))].index
    periodColumn =  df['Period']
    snapShotColumn = df['Project']
    periodColumn[periodIndexNames] = pd.date_range(start='1/1/2021', periods=12, freq='M')

我们有大约24000个项目


Tags: the项目projecttruedffordataindex
2条回答
import pandas
import numpy

x = numpy.arange(1,24000)
months = pandas.DataFrame(pandas.date_range('2021-01-01', '2022-01-01', freq='M'))
projects = pandas.DataFrame(x)
%time projects_status = projects.merge(pandas.DataFrame(months), how='cross')

#CPU times: user 25.8 ms, sys: 2.54 ms, total: 28.3 ms
#Wall time: 35.9 ms

IIUC,如果您有这样一个数据帧df

  Project  Status
0     101    Open
1     102  Closed

您可以重复将日期范围放入第三列,然后explode它,即

dates = pd.date_range(start="1/1/2021", periods=12, freq="M")

df["Period"] = [dates] * len(df)

df = df.explode("Period")

得到

  Project  Status     Period
0     101    Open 2021-01-31
0     101    Open 2021-02-28
0     101    Open 2021-03-31
0     101    Open 2021-04-30
0     101    Open 2021-05-31
0     101    Open 2021-06-30
0     101    Open 2021-07-31
0     101    Open 2021-08-31
0     101    Open 2021-09-30
0     101    Open 2021-10-31
0     101    Open 2021-11-30
0     101    Open 2021-12-31
1     102  Closed 2021-01-31
1     102  Closed 2021-02-28
1     102  Closed 2021-03-31
1     102  Closed 2021-04-30
1     102  Closed 2021-05-31
1     102  Closed 2021-06-30
1     102  Closed 2021-07-31
1     102  Closed 2021-08-31
1     102  Closed 2021-09-30
1     102  Closed 2021-10-31
1     102  Closed 2021-11-30
1     102  Closed 2021-12-31

相关问题 更多 >

    热门问题