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 Réponses :
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
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. :)
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.
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:
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 () code> 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.
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.