我有一个看起来像这样的熊猫数据框,
id start end
0 1 2020-02-01 2020-04-01
1 2 2020-04-01 2020-04-28
我还有两个其他参数,它们是日期值,例如x和y。x和y始终是该月的第一天。
我想将上面的数据框扩展为以下所示的x =“ 2020-01-01”和y =“ 2020-06-01”,
id month status
0 1 2020-01 -1
1 1 2020-02 1
2 1 2020-03 2
3 1 2020-04 2
4 1 2020-05 -1
5 1 2020-06 -1
6 2 2020-01 -1
7 2 2020-02 -1
8 2 2020-03 -1
9 2 2020-04 1
10 2 2020-05 -1
11 2 2020-06 -1
数据框扩展为每个ID,将在(x,y)行之间添加额外的months_between。然后创建一个状态列并填充值,
我正在尝试在熊猫中解决此问题而不循环。我当前使用的解决方案是使用循环,并且需要更长的时间才能运行大型数据集。
有任何熊猫功能可以在这里帮助我吗?
感谢@Code不同的解决方案。它解决了这个问题。但是,该问题有一个扩展,即数据帧看起来像这样,
id start end
0 1 2020-02-01 2020-02-20
1 1 2020-04-01 2020-05-10
2 2 2020-04-10 2020-04-28
一个ID可以有多个条目。对于上面的x和y(相隔6个月),我想在数据框中为每个id创建6行。该解决方案当前为数据框中的每一行创建6行。可以,但在处理具有数百万个ID的数据框时并不理想。
确保start
和end
列的类型为Timestamp
:
# Explode each month between x and y
x = '2020-01-01'
y = '2020-06-01'
df['month'] = [pd.date_range(x, y, freq='MS')] * len(df)
df = df.explode('month').drop_duplicate(['id', 'month'])
# Determine the status
df['status'] = -1
cond = df['start'] == df['month']
df.loc[cond, 'status'] = 1
cond = (df['start'] < df['month']) & (df['month'] <= df['end'])
df.loc[cond, 'status'] = 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句