Как вставить строки с 0 данными для пропущенных кварталов в кадр данных pandas? - PullRequest
1 голос
/ 02 апреля 2019

У меня есть фрейм данных с определенными значениями квот для заданных кварталов (формат YYYY-Qx), и мне нужно визуализировать их с помощью некоторых линейных диаграмм.Однако некоторые кварталы отсутствуют (поскольку в течение этих кварталов не было квот).

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

Я хочу добавить их (начиная с 2017-I квартала до сегодняшнего дня, поэтому с 2019-Q2) к кадру данныхсо значением по умолчанию 0 в столбце Quota.Желаемый результат будет следующим:

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')

И затем пересчитал df с частотой 'Q', но я должен делать что-то не так, как это неничем не помогу.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Использование:

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
0 голосов
/ 02 апреля 2019

# Альтернативное решение, основанное на левом соединении

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...