我有以下資料框,日期對應于季度期間和對應于關聯id分組的金額(以及此處未顯示的其他附加列為簡化)。每個 id 的日期都是唯一的。
import pandas as pd
from numpy import nan
d = {'id': ['a', 'a', 'a', 'b', 'b'], 'date': ['2020-09-30', '2020-06-30', '2020-03-31',
'2020-09-30', '2020-06-30'], 'amount': [1, 2, nan , 5, nan]}
df = pd.DataFrame(data=d)
df['date'] = pd.to_datetime(df['date'])
df
id date amount
0 a 2020-09-30 1
1 a 2020-06-30 2
2 a 2020-03-31
3 b 2020-09-30 5
4 b 2020-06-30
我想延長季度從過去設定的開始季度日期開始的時間段,以便每個 id 的季度期間開始并存在于相同的日期。在此示例中,資料應從 開始,2019-12-31如果缺少該行,則應填充其間的任何季度。
我想根據最近的現值回填缺失值(例如金額)。
輸出將如下所示:
id date amount
a 2020-09-30 1
a 2020-06-30 2
a 2020-03-31 2
a 2019-12-31 2
b 2020-09-30 5
b 2020-06-30 5
b 2020-03-31 5
b 2019-12-31 5
解決這個問題的最佳方法是什么?
uj5u.com熱心網友回復:
您需要從 2019 年 12 月 31 日開始每三個月定義一個新的時間范圍,并重新索引您的資料框。然后NaN使用向后填充bfill方法填充值。請參閱下面帶有注釋的代碼。
import pandas as pd
# Create the DataFrame according to your question
d = {'id': ['a', 'a', 'a', 'b', 'b'], 'date': ['2020-09-30', '2020-06-30', '2020-03-31',
'2020-09-30', '2020-06-30'], 'amount': [1, 2, None, 5, None]}
df = pd.DataFrame(data=d)
# Transform date to datetime column
df['date'] = pd.to_datetime(df['date'])
# Set multiindex to (id, date) as they are the "unique keys" of your amount values
df.set_index(['id', 'date'], inplace=True)
# Define new period for the datetime index (every 3 months)
index = pd.date_range('2019-12-31', '2020-09-30', freq='3M')
# Reindex the Dataframe and fill NaNs with a backward method
print(df.reindex(pd.MultiIndex.from_product([df.index.get_level_values(0).unique(), index])).fillna(method='bfill'))
# Output
# amount
# id
# a 2019-12-31 2.0
# 2020-03-31 2.0
# 2020-06-30 2.0
# 2020-09-30 1.0
# b 2019-12-31 5.0
# 2020-03-31 5.0
# 2020-06-30 5.0
# 2020-09-30 5.0
注意:需要設定包含id列的多索引,因為您想重新采樣日期而不合并id值a和b.
uj5u.com熱心網友回復:
pyjanitor的完整函式提供了用于暴露缺失行的抽象:
# pip install pyjanitor
import pandas as pd
import numpy as np
# create a mapping of the new dates
# reusing @scandav's index variable
index = pd.date_range('2019-12-31', '2020-09-30', freq='3M')
index = dict(date = index)
(df.complete('id', index)
.sort_values(['id', 'date'], ascending = [True, False])
.ffill(downcast = 'infer')
)
id date amount
0 a 2020-09-30 1
1 a 2020-06-30 2
2 a 2020-03-31 2
5 a 2019-12-31 2
3 b 2020-09-30 5
4 b 2020-06-30 5
7 b 2020-03-31 5
6 b 2019-12-31 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327944.html
標籤:Python 熊猫 数据框 日期 pandas-groupby
上一篇:如何在R中按日期合并/堆疊觀察
