pandas 间隔更改粒度上的性能

qf9go6mv  于 2023-04-04  发布在  其他
关注(0)|答案(1)|浏览(114)

在Pandas上工作,我在一个步骤上有性能问题。它在少量数据上工作,但我不能在合理的时间内对较大的数据量有一个答案。
我有这样一个 Dataframe :

ColA ColB ColC start      end
1    1    1    2020-01-01 2021-01-01

对于像这样的715K行和您看到的5列,每一行的日期都不同
我想改变dataframe的粒度,使其具有这样的行,因为在intervalls中有日期
大概是这样的

ColA ColB ColC Date
1    1    1    2020-01-01
1    1    1    2020-01-02
[...]
1    1    1    2020-12-31
1    1    1    2021-01-01

由于我估计间隔平均由100个日期组成,因此最后应该有大约7150万行
我试过这个:

df2= p.DataFrame(columns=['ColA','ColB', 'ColC','DATE'])
for index, row in df1.iterrows():
        ColA = row['ColA']
        ColB = row['ColB']
        ColC = row['ColC']
        start_date = p.to_datetime(row['start'])
        end_date = p.to_datetime(row['end'])   
        delta = end_date - start_date  
        for i in range(delta.days + 1):
            day = start_date + timedelta(days=i)
            new_row = {'ColA': CoLA, 'ColB': ColB, 'ColC':ColC, 'DATE':day}
            df2= df2.append(new_row, ignore_index=True)

但是已经运行了几个小时没有结果了:(
你知道我怎样才能做得更好吗?谢谢你的回答

kpbwa7wx

kpbwa7wx1#

尝试先创建整个列,然后分解:

df['Date'] = df.apply(lambda x: pd.date_range(x['start'], x['end'], freq='D').tolist(), axis=1)

df.drop(columns=['start','end']).explode('Date')

输出:

ColA  ColB  ColC       Date
0      1     1     1 2020-01-01
0      1     1     1 2020-01-02
0      1     1     1 2020-01-03
0      1     1     1 2020-01-04
0      1     1     1 2020-01-05
..   ...   ...   ...        ...
0      1     1     1 2020-12-28
0      1     1     1 2020-12-29
0      1     1     1 2020-12-30
0      1     1     1 2020-12-31
0      1     1     1 2021-01-01

注意由于原始大小和日期范围的原因,您的数据相对较大。这样会快一点,但第一个操作(创建Date)仍然会很慢。

相关问题