2016-05-31 5 views
1

У меня есть большой фрейм данных, который содержит тысячи точек данных, и есть один столбец с названием период с форматом 2011q1 - это четверть 1 в 2011 году с 2009q2 до 2015q2. После групповой работы я получил несколько кадров суб-данных, и каждый из них содержит только определенный интервал времени, а не весь промежуток времени с 2009 по 2015 год. См. Изображение ниже столбца периода из одного подфайла df. Теперь я хочу построить весь sub df со всем периодом периода от 2009q2 до 2015q2 в качестве тиков x axis и агрегировать значения из столбца Amount в качестве значений y; значение y для конкретного sub df должно быть 0 для любого отсутствующего периода, но теперь я мог бы получить график только с его собственной колонкой периода в виде тисков x оси, если бы я использовал код person.groupby('Period').aggregate({'Amount':np.sum}).plot(rot='vertical')как построить sub df со значениями из целого набора данных по типу x оси в python

Я подумываю о добавлении строки с отсутствующими временными интервалами для каждого sub df, но, похоже, много работы. Есть ли способ, которым я могу добиться этого, вместо добавления строк вручную?

enter image description here

+0

Сформировать список всех возможных данных и использовать этот список в качестве меток для оси х в Matplotlib. – Serenity

+0

@StanleyR Как использовать сгенерированный список как метку в matplotlib? Я не знаком с кодом. – xzt

+0

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html – Serenity

ответ

1

Вы могли бы, конечно, это путь Стэнли, и, возможно, использовать full_df['Period'].unique(), чтобы получить ваши ярлыки. Но мне кажется, что вы на самом деле хотите вернуться, прежде чем делать groupby и использовать сводную таблицу.

import pandas as pd 


D=pd.DataFrame({'Period':['Q1','Q1','Q2','Q2','Q4', 
         'Q2','Q2','Q3','Q3','Q4'], 
       'Name':['Jack','Jack','Jack','Jack','Jack', 
         'Jill','Jill','Jill','Jill','Jill'], 
       'Amount':[50,20,60,100,200, 
         65,15,25,35,150]}) 
D 

-

Amount Name Period 
0 50 Jack Q1 
1 20 Jack Q1 
2 60 Jack Q2 
3 100 Jack Q2 
4 200 Jack Q4 
5 65 Jill Q2 
6 15 Jill Q2 
7 25 Jill Q3 
8 35 Jill Q3 
9 150 Jill Q4 

Сводные таблицы, суммируя агрегированные значения, и вызвать fillna преобразовать в пренебрежимо малых нулей.

P=D.pivot_table('Amount','Period','Name',aggfunc=sum).fillna(0) 
P 

-

Name Jack Jill 
Period  
Q1 70 0 
Q2 160 80 
Q3 0 60 
Q4 200 150 

А затем использовать свои обычные инструменты для построения. Например.

P.plot(kind='bar') 

enter image description here

или

P['Jill'].plot(kind='bar') 

enter image description here