3
votes

python - Comment définir la colonne comme index dans un DataFrame

Ci-dessous, mon DataFrame pandas actuel:

df = pd.DataFrame(salary_List)
newdf = df.groupby('date').sum()
newdf = df.groupby(pd.Grouper(key='date', freq='1M')).sum()
newdf.index = newdf.index.strftime('%b-%y')
newdf.index.name = 'Month'

est-il possible de convertir le DataFrame ci-dessus dans le format ci-dessous?

                        Month1  Month2  Month3  Month4  Month5  Month6
Balance before Salary   27.2    88.2    176.48  48.48   241.48  49.48
Salary                 15300    15300   14783   16249   14448   15663

Code

         Balance before Salary   Salary
Month                                 
Jun-18                  27.20  15300.0
Jul-18                  88.20  15300.0
Aug-18                 176.48  14783.0
Sep-18                  48.48  16249.0
Oct-18                 241.48  14448.0
Nov-18                  49.48  15663.0

Quelqu'un peut-il m'aider à ce sujet?


3 commentaires

Avez-vous besoin de transposer ? df = df.T ?


Comment changer l'en-tête de colonne en Mois1 Mois2 etc.?


Vérifiez ma réponse.


3 Réponses :


3
votes

Je pense que vous avez besoin de transposer par T et puis si nécessaire, changez les noms de colonnes, ajoutez la compréhension de la liste:

Remarque:
Double groupby + somme n'est pas nécessaire, une fois suffit, car agréger la même fonction d'agrégation, ici sum.

df = pd.DataFrame(salary_List)

newdf = df.groupby(pd.Grouper(key='date', freq='1M')).sum().T
#python 3.6+
newdf.columns = [f'Month{x}' for x in range(1, len(newdf.columns) + 1)]

#python bellow
#newdf.columns = ['Month{}'.format(x) for x in range(1, len(newdf.columns) + 1)]
print (newdf)
                        Month1   Month2    Month3    Month4    Month5  \
Balance before Salary     27.2     88.2    176.48     48.48    241.48   
Salary                 15300.0  15300.0  14783.00  16249.00  14448.00   

                         Month6  
Balance before Salary     49.48  
Salary                 15663.00  


1 commentaires

Bonne utilisation du formatage du nom de colonne. :) +1 de ma part, veuillez jeter un oeil à ma méthode aussi, j'ai une idée. :)



1
votes

Ce que vous voulez faire s'appelle «transposer». Vous pouvez obtenir le dataframe transposé en appelant la fonction df.transpose () . Donc pour vous simplement:

df = pd.DataFrame(salary_List)
newdf = df.transpose()

Ensuite, avec une simple boucle, vous pouvez changer les noms des colonnes pour ceux que vous voulez.


0 commentaires

1
votes

Vous pouvez également obtenir le mois et l'année (pour plus de clarté) puis les transposer:

réinitialiser l'index pour obtenir le mois sous forme de colonne:

df['Month'] = df['Month'].apply( lambda x : pd.to_datetime(x).strftime('%b %Y')) # gets name of month and year
df_new = df1.T #transpose and save to new df
df_new.columns = df_new.iloc[0] # set columnnames as monthnames
df_new.drop('Month',inplace=True) # drop the extra row Month

Ensuite :

df1 = df1.rename_axis('Month').reset_index()
df1.drop([0],inplace=True)

Résultat:

 entrez la description de l'image ici


4 commentaires

Oui, mais OP a des données d'entrée un peu différentes, donc votre solution ne fonctionne pas. Les données d'entrée sont la colonne date fille par datetimes, donc fonctionnant newdf = df.groupby (pd.Grouper (key = 'date', freq = '1M')). Sum () très sympa. La sortie du premier DataFrame est après newdf.index.name = 'Month'


J'ai testé cela avec les mêmes données que l'OP a données, semble fonctionner pour moi.


Bien sûr, mais Ci-dessous est mes pandas DataFrame actuels: est après le paragraphe du code df = pd.DataFrame (liste des salaires) newdf = df.groupby ('date'). Sum () newdf = df.groupby (pd.Grouper (clé = 'date', freq = '1M')). sum () newdf.index = newdf.index.strftime ('% b-% y') newdf.index.name = ' Mois '


compris, j'avais le Mois comme colonne.