如何在python中将多天转换为每天?
我有以下如何在python中将多天转换为每天?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有以下数据帧: import pandas as pd dt = pd.DataFrame({'start_date': ['2019-05-20', '2019-05-21', '2019-05-21'], 'end_date': ['2019-05-23', '2019-05-24', '2019-05-22'], 'reg': ['A', 'B','A'],
数据帧
:
import pandas as pd
dt = pd.DataFrame({'start_date': ['2019-05-20', '2019-05-21', '2019-05-21'],
'end_date': ['2019-05-23', '2019-05-24', '2019-05-22'],
'reg': ['A', 'B','A'],
'measure': [100, 200,1000]})
我想创建一个名为“日期”的新列,该列的值从start\u date
到end\u date
,还有一个新列measure\u daily
,该列将是measure
在这些日期之间平均分布
基本上,我想用行来扩展dt
因此,我希望最终df如下所示:
dt_f = pd.DataFrame({'date':['2019-05-20','2019-05-21','2019-05-22','2019-05-23','2019-05-21','2019-05-22','2019-05-23','2019-05-24', '2019-05-21','2019-05-22'],
'reg':['A','A','A','A','B','B','B','B','A','A'],
'measure_daily':[25,25,25,25,50,50,50,50,500,500]})
在python中有没有一种有效的方法来实现这一点?TL;博士
给我一个解决方案:
细分: 首先,我们将您的
开始
和结束日期
添加到同一列:
dt = dt.assign(key=dt.index)
melt = dt.melt(id_vars = ['reg', 'measure', 'key'], value_name='date').drop('variable', axis=1)
reg measure key date
0 A 100 0 2019-05-20
1 B 200 1 2019-05-21
2 A 1000 2 2019-05-21
3 A 100 0 2019-05-23
4 B 200 1 2019-05-24
5 A 1000 2 2019-05-22
然后我们每天在应用groupby
的同时将不同的reg
保留在各自的组中
melt = pd.concat(
[d.set_index('date').resample('d').first().ffill() for _, d in melt.groupby(['reg', 'key'], sort=False)]
).reset_index()
date reg measure key
0 2019-05-20 A 100.0 0.0
1 2019-05-21 A 100.0 0.0
2 2019-05-22 A 100.0 0.0
3 2019-05-23 A 100.0 0.0
4 2019-05-21 B 200.0 1.0
5 2019-05-22 B 200.0 1.0
6 2019-05-23 B 200.0 1.0
7 2019-05-24 B 200.0 1.0
8 2019-05-21 A 1000.0 2.0
9 2019-05-22 A 1000.0 2.0
最后,我们将measure
列分布在各组的size
上,包括:
那么您想按行扩展数据帧吗?@Erfan是,exactly@Xcodebeginner这个问题有两个主要区别:它没有考虑日期范围,也没有推广这一措施equally@anky_91我编辑了初始的
dt
,以创建一个“可复制的最终结果”。A&B现在每人都有4天。你认为,有一种方法可以扩展这个解决方案,以防在同一区域内的日期重叠?在同一区域内重叠的日期会是什么样子?您的意思是,在数据集上更远的某个地方,区域A
将再次显示重叠的日期@数量,没错@killswitch解决方案我认为这是最后一个问题,在数据帧下方的一个新的reg
与相同的reg具有相同的measure
值,但在数据帧的上方会发生这种情况吗@quantLast编辑,这将提供正确的输出,并在大数据帧上快速运行
melt = pd.concat(
[d.set_index('date').resample('d').first().ffill() for _, d in melt.groupby(['reg', 'key'], sort=False)]
).reset_index()
date reg measure key
0 2019-05-20 A 100.0 0.0
1 2019-05-21 A 100.0 0.0
2 2019-05-22 A 100.0 0.0
3 2019-05-23 A 100.0 0.0
4 2019-05-21 B 200.0 1.0
5 2019-05-22 B 200.0 1.0
6 2019-05-23 B 200.0 1.0
7 2019-05-24 B 200.0 1.0
8 2019-05-21 A 1000.0 2.0
9 2019-05-22 A 1000.0 2.0
melt.assign(measure = melt['measure'].div(melt.groupby(['reg', 'key'], sort=False)['reg'].transform('size'))).drop('key', axis=1)
date reg measure
0 2019-05-20 A 25.0
1 2019-05-21 A 25.0
2 2019-05-22 A 25.0
3 2019-05-23 A 25.0
4 2019-05-21 B 50.0
5 2019-05-22 B 50.0
6 2019-05-23 B 50.0
7 2019-05-24 B 50.0
8 2019-05-21 A 500.0
9 2019-05-22 A 500.0