在 Pandas 上工作我有一个步骤的性能问题。 它正在处理少量数据,但我无法在合理的时间内得到大量数据的答案。
我有一个这样的数据框:
ColA ColB ColC start end
1 1 1 2020-01-01 2021-01-01
有 715K 行像这行和你看到的 5 列,每一行的日期都不同
我想将数据框的粒度更改为具有间隔中有日期的行
像这样的东西:
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 个日期组成,我最后应该有大约 71.5M 行
我试过这个:
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)
但是它已经运行了几个小时没有结果:(
你知道我怎样才能做得更好吗? 谢谢解答
尝试先创建整个列,然后展开:
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
)仍然很慢。