Ma base de données d'Excel contient des informations par pays depuis des années. Le problème est que chaque année est un en-tête de colonne différent. Par exemple:

Country      Indicator   1950    1951    1952
Australia       x         10      27     20
Australia       y          7      11      8
Australia       z         40      32     37

Je souhaite convertir chaque indicateur en en-tête de colonne et créer une colonne par année. Comme ça:

Country         year          x       y     z
Australia       1950         10       7     40
Australia       1951         27      11     32
Australia       1952         20       8     37

Et je ne sais pas combien de pays figurent dans la colonne. Années = 1950 à 2019

3
Vectorst 9 mai 2020 à 03:38

3 réponses

Meilleure réponse

Nous pouvons mettre en forme avec stack et unstack

df.set_index(['Country','Indicator']).stack().unstack(level=1).reset_index()
Indicator    Country level_1   x   y   z
0          Australia    1950  10   7  40
1          Australia    1951  27  11  32
2          Australia    1952  20   8  37
3
YOBEN_S 9 mai 2020 à 00:47

Ce n'est qu'une exploration ... La solution de @ Yoben est la bonne façon de le faire via Pandas ... Je vois juste quelles autres possibilités il y a:

#create a dictionary of the years
years = {'Year' : df.filter(regex='\d').columns}

#get the data for the years column
year_data = df.filter(regex='\d').to_numpy()

#create a dictionary from the indicator and years columns pairing
reshaped = dict(zip(df.Indicator,year_data))
reshaped.update(years)

#create a new dataframe
pd.DataFrame(reshaped,index=df.Country)

            x   y   z   Year
Country             
Australia   10  7   40  1950
Australia   27  11  32  1951
Australia   20  8   37  1952

Vous ne devriez jamais avoir à faire cela, car vous pourriez facilement travailler dans le dataframe, sans avoir besoin d'en créer un nouveau. Le seul moment où vous pouvez considérer cela est pour la vitesse. A part ça, juste quelque chose à explorer

1
sammywemmy 9 mai 2020 à 01:08

Ce n'est pas exactement ce que vous recherchez, mais si votre dataframe est la variable df, vous pouvez utiliser la méthode transpose pour inverser le dataframe.

In [7]: df                                                                                           
Out[7]: 
   col1   col2  col3
0     1   True    10
1     2  False    10
2     3  False   100
3     4   True   100

Transposer

In [8]: df.T                                                                                         
Out[8]: 
         0      1      2     3
col1     1      2      3     4
col2  True  False  False  True
col3    10     10    100   100

Je pense que vous avez un dataframe multi-index donc vous voudrez peut-être vérifier la documentation à ce sujet.

0
GeneticsGuy 9 mai 2020 à 00:46