python - 将季度数据框转换为每月数据框并填充每个 ID 的缺失值

标签 python pandas dataframe

我有一个数据帧,对于每个 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

最佳答案

我想你可以groupbyresample:

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/

相关文章:

重新编码 '[.data.table'

python - DataFrame和Series之间如何进行逻辑运算?

python - Pandas:重新采样数据框列,获取对应于最大值的离散特征

python - Pandas 有条件地交换两列中的值

在不一致的时间序列上使用 Pandas 的 Python EMA

python - 如何使用新的索引和列更新 Pandas DataFrame

python - PostgreSQL 和 Pyramid : ProgrammingError: relation "records" does not exist

python - Python 中的运算符优先级 -PEMDAS

python - 将数据帧转换为字典,其中列具有重复值,字典值作为列表

r - 天际线查询或高效边界的实现