2017-09-09 3 views
0

J'ai une structure DataFrame dérivée d'un fichier CSV sur des statistiques de population sur un certain nombre d'années. À savoir, les colonnes du fichier sont des intervalles de temps mensuels (1999-01, 1999-02 ... 2016-12) et les rangées sont des centres de population différents dans le monde (par exemple Londres, Toronto, Boston, etc.):Extraction et regroupement d'ensembles de colonnes dans un ensemble de données Pandas

df = pd.DataFrame({'1999-01' : [100, 5000, 8000], '1999-02' : [200, 6000, 9000], '1999-03' : [300, 7000, 10000], ..., cities : ['CityA', 'CityB', 'CityC' ...]}) 

Je voudrais séparer ces colonnes sur une base trimestrielle. Donc, je prendrais la moyenne des populations 1999-01, 1999-1902, 1999-9 pour chaque ligne, et de créer une nouvelle colonne « 1999T1 » pour cette entrée, le faire avec tous les 3 mois:

df_quarter = pd.DataFrame({'1999Q1' : [200, 6000, 9000], '1999Q2' : ..., cities = ['CityA', 'CityB', 'CityC' ...]}) 

#Q1 corresponds to months 01-03, Q2 to months 04-06, Q3 to months 07-09, Q4 months 10-12, all inclusive 

Cependant , J'ai du mal à conceptualiser la requête pour y parvenir. J'ai un demi-esprit pour utiliser .groupby() et ensuite .agg(), mais je ne suis pas sûr de la façon dont je pourrais spécifier efficacement un groupement à 3 colonnes et parcourir les colonnes. Quelqu'un pourrait-il me diriger dans la bonne direction?

EDIT: Supposons que les colonnes ne soient pas des dates, mais plutôt quelque chose de plus abstrait, et qu'un simple rééchantillonnage des périodes ne puisse pas être utilisé. Par exemple:

#Prices of different foods from different vendors 
df = pd.DataFrame({'oranges' : [2, 3, 7], 'apples' : [6, 3, 9], 'cheese' : [13, 9, 11], 'milk' : [6, 5, 12], 'vendors' : ['VendorA', 'VendorB', 'VendorC']}) 

Maintenant, si je voulais créer deux colonnes, combinant les fruits et les produits laitiers, est-il un moyen que je pourrais spécifier les indices à agréger sur?

+2

S'il vous plaît lire [ce] (http: // stackoverflow .com/questions/20109391/how-to-make-good-reproducible-pandas-examples) et apprenez à poser une bonne question sur les pandas. Personne ne va produire des exemples et des solutions pour vous de nulle part. –

+0

Apportera les modifications appropriées. –

Répondre

0

Vous pouvez convertir des colonnes to_datetime puis à month period avec to_period d'abord, puis resample par des colonnes (axis=1) et quarter (q) avec un agrégat mean:

df = pd.DataFrame({'1999-01':[4,5,4,5,5,4], 
        '1999-02':[7,8,9,4,2,3], 
        '1999-03':[1,3,5,7,1,0], 
        '1999-04':[1,3,5,7,1,0], 
        '1999-05':[5,3,6,9,2,4]}, index=list('abcdef')) 

print (df) 
    1999-01 1999-02 1999-03 1999-04 1999-05 
a  4  7  1  1  5 
b  5  8  3  3  3 
c  4  9  5  5  6 
d  5  4  7  7  9 
e  5  2  1  1  2 
f  4  3  0  0  4 

df.columns = pd.to_datetime(df.columns).to_period('m') 
df = df.resample('q', axis=1).mean() 

print (df) 
    1999Q1 1999Q2 
a 4.000000  3.0 
b 5.333333  3.0 
c 6.000000  5.5 
d 5.333333  8.0 
e 2.666667  1.5 
f 2.333333  2.0 
+1

Veuillez arrêter d'encourager les questions de mauvaise qualité. Si quelqu'un d'autre répondait, j'aurais tout de suite refusé. En répondant à de telles questions, vous encouragez plus de telles questions, que vous savez ne aidera personne à l'avenir, sauf OP. –

+2

@ cᴏʟᴅsᴘᴇᴇᴅ - merci. Hmmm, je suis d'accord mieux répond si de belles données d'entrée, la sortie désirée, le code. C'est idéal. Mais il est parfois possible de comprendre à partir du texte ce dont l'OP a besoin. Donc, il semble que je le comprends, alors je crée une réponse. – jezrael

+0

Je suis d'accord avec @ cssᴘᴇᴇᴅ ici. Si nous voulons toujours aller de l'avant et répondre, je pense, OP ou le répondeur devrait reformater la question/ajouter des détails pour un meilleur usage futur. – Zero