如何将缺失的四分之一的数据为0的行插入到熊猫数据框中?

时间:2019-04-02 08:02:29

标签: python pandas datetime dataframe

我有一个数据框,它具有给定季度的特定配额值(YYYY-Qx格式),并且需要用一些折线图将它们可视化。但是,某些季度丢失了(因为这些季度没有配额)。

Period      Quota
2017-Q1     500
2017-Q3     600
2018-Q2     700

我想将它们(从2017-Q1开始直到今天,所以是2019-Q2)添加到数据框中,在“配额”列中的默认值为0。所需的输出如下:

Period      Quota
2017-Q1     500
2017-Q2     0
2017-Q3     600
2017-Q4     0
2018-Q1     0
2018-Q2     700
2018-Q3     0
2018-Q4     0
2019-Q1     0
2019-Q2     0

我尝试过

df['Period'] = pd.to_datetime(df['Period']).dt.to_period('Q')

然后以'Q'频率对df重新采样,但是我必须做错了,因为它对任何事情都无济于事。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用:

df.index = pd.to_datetime(df['Period']).dt.to_period('Q')
end = pd.Period(pd.datetime.now(), freq='Q')

df = (df['Quota'].reindex(pd.period_range(df.index.min(), end), fill_value=0)
                 .rename_axis('Period')
                 .reset_index()
                )
df['Period'] = df['Period'].dt.strftime('%Y-Q%q')
print (df)
    Period  Quota
0  2017-Q1    500
1  2017-Q2      0
2  2017-Q3    600
3  2017-Q4      0
4  2018-Q1      0
5  2018-Q2    700
6  2018-Q3      0
7  2018-Q4      0
8  2019-Q1      0
9  2019-Q2      0

答案 1 :(得分:0)

#基于左联接的替代解决方案

qtr=['Q1','Q2','Q3','Q4']
finl=[]
for i in range(2017,2020):
    for j in qtr:
        finl.append((str(i)+'_'+j))

df1=pd.DataFrame({'year_qtr':finl}).reset_index(drop=True)
df1.head(2)

original_value=['2017_Q1' ,'2017_Q3' ,'2018_Q2']
df_original=pd.DataFrame({'year_qtr':original_value,
                        'value':[500,600,700]}).reset_index(drop=True)

final=pd.merge(df1,df_original,how='left',left_on=['year_qtr'], right_on =['year_qtr'])
final.fillna(0)

输出

year_qtr    value
0   2017_Q1 500.0
1   2017_Q2 0.0
2   2017_Q3 600.0
3   2017_Q4 0.0
4   2018_Q1 0.0
5   2018_Q2 700.0
6   2018_Q3 0.0
7   2018_Q4 0.0
8   2019_Q1 0.0
9   2019_Q2 0.0
10  2019_Q3 0.0
11  2019_Q4 0.0