我有一个数据帧,对于每个 ID,都包含一个时间戳和一个值。时间戳是给定季度的:
import pandas as pd
a = pd.DataFrame({'id': [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3],
'date': ['2002Q1', '2002Q2', '2002Q3', '2002Q4', '2003Q1', '2002Q2', '2002Q3', '2002Q4', '2003Q1', '2002Q2', '2002Q3', '2002Q4', '2003Q1', '2002Q2', '2002Q3', '2002Q4'],
'value': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]})
现在,我想将数据框扩展到每月频率。这意味着每行扩展到三行(即,一个季度变成 3 个月),并且任何给定季度的所有月份都应具有相同的值。
作为示例,我们将 a
中的前两行扩展为 6 行:
pd.DataFrame({'id': [1,1,1,1,1,1],
'date': ['2002-1', '2002-2', '2002-3', '2002-4', '2002-5', '2002-6'],
'value': [1,1,1,2,2,2]})
所以基本上,我所做的与this answer中的相同。 ,但现在涉及到一个ID。
可以这样做吗?
编辑:每组的最后一个值也需要扩展。当前的解决方案给出了这个结果,这是错误的:
import pandas as pd
a = pd.DataFrame({'id': [1,1],
'date': ['2002Q1', '2002Q2'],
'value': [1,2]})
mask = a['id'].duplicated(keep='last')
dates = pd.to_datetime(a['date'])
a.index = dates.where(mask, dates + pd.DateOffset(months=2))
a = a.groupby('id')['value'].resample('MS').first().ffill().reset_index()
a['date'] = a['date'].dt.to_period('M')
a
id date value
0 1 2002-01 1.0 # fine
1 1 2002-02 1.0 # fine
2 1 2002-03 1.0 # fine
3 1 2002-04 1.0 # should be 2
4 1 2002-05 1.0 # should be 2
5 1 2002-06 2.0 # fine
最佳答案
我想你可以groupby
和resample
:
a['date'] = pd.to_datetime(a['date'])
(a.set_index('date')
.groupby('id')
['value']
.resample('MS')
.first().ffill()
.reset_index()
)
输出:
date id value
0 2002-01-01 1.0 1.0
1 2002-02-01 1.0 1.0
2 2002-03-01 1.0 1.0
3 2002-04-01 1.0 2.0
4 2002-05-01 1.0 2.0
关于python - 将季度数据框转换为每月数据框并填充每个 ID 的缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69044145/