Reputation: 361
With my code I have some results in csv and are right, the problem is I need mean()
the two columns that I'm drop because I don't know why I can sum some columns and mean the others.
I added the csv text to be more specific and my output. Also, the output that I'm looking for!
code:
"""Calculate"""
# encoding=utf8
import pandas as pd
dfh = pd.read_csv("este_mes.csv", sep=',')
h = dfh['Fecha'].max()
dfh['Cliente'] = dfh['Cliente'] + "," + h
dfh = dfh.groupby(['Cliente']).sum()
frames = [dfh]
results2 = pd.concat(frames)
results2 = results2.drop('Fill_rate', 1)
results2 = results2.drop('ECPM_medio', 1)
results2.to_csv("Cliente_x_mes.csv", sep=',', index=True)
results2 = pd.read_csv("Cliente_x_mes.csv", sep=',')
csv:
Cliente,Fecha,Status,cl_fecha,Subastas,Impresiones_exchange,Fill_rate,Importe_a_pagar_a_medio,ECPM_medio
jjj,01/01/2018,Alerta Revenue: aumento Subastadas - descenso eCPM y Fillrate,jjj_01/01/2018,1930916,53231,2.76,17.32,0.33
jjj,02/01/2018,Alerta Fillrate -- Incremento Revenue - Imp Vendidas - Subastadas,jjj_02/01/2018,5930774,98181,1.66,33.2,0.34
jjj,03/01/2018,Estable,jjj_03/01/2018,5487499,97782,1.78,33.37,0.34
jjj,04/01/2018,Estable,jjj_04/01/2018,5254018,98039,1.87,32.95,0.34
jjj,05/01/2018,Estable,jjj_05/01/2018,4904150,98068,2.0,31.58,0.32
jjj,06/01/2018,Alerta Revenue - Imp Vendidas - Subastadas -- Incremento Fillrate: descenso eCPM,jjj_06/01/2018,4904150,98068,2.0,31.58,0.32
kkk,01/01/2018,Alerta Fillrate - Revenue - Imp Vendidas,kkk_01/01/2018,30668,4464,14.56,3.87,0.87
kkk,02/01/2018,Incremento Imp Vendidas - Subastadas: descenso eCPM,kkk_02/01/2018,41032,5707,13.91,4.06,0.71
kkk,03/01/2018,Estable,kkk_03/01/2018,39847,5331,13.38,3.72,0.7
kkk,04/01/2018,Estable: descenso Imp Vendidas,kkk_04/01/2018,37403,4733,12.65,3.37,0.71
kkk,05/01/2018,Estable: descenso Fillrate,kkk_05/01/2018,40330,4473,11.09,3.35,0.75
kkk,06/01/2018,Estable: descenso Subastadas y aumento Fillrate,kkk_06/01/2018,32797,4050,12.35,3.22,0.8
The output:
Cliente,Subastas,Impresiones_exchange,Importe_a_pagar_a_medio
"jjj,10/01/2018",44367734,946163,303.14
"kkk,10/01/2018",382800,47851,36.47
The output I need:
Cliente,Subastas,Impresiones_exchange,Importe_a_pagar_a_medio,Fill_rate,ECPM_medio
"jjj,10/01/2018",44367734,946163,303.14,30,0.331666667
"kkk,10/01/2018",382800,47851,36.47,3.598333333,0.756666667
On the other hand if you can have the output with only 2 decimals it will be great
Upvotes: 1
Views: 223
Reputation: 402553
Option 1
Split your grouping code into two stages. First, create a groupby
object, and then calculate sum/mean for the appropriate columns.
m = ['Fill_rate', 'ECPM_medio'] # columns to calculate mean for
s = df.columns.difference(m).tolist() # columns to calculate sum for
An alternate manner of finding s
(for numeric columns only) -
s = df.columns[df.dtypes != object].difference(m).tolist()
Next,
# Stage 1
g = df.groupby('Cliente')
# Stage 2
i = g[s].sum()
j = g[m].mean()
# concatenate results, and save to CSV
pd.concat([i, j], 1).to_csv('Cliente_x_mes.csv')
Details
i
Importe_a_pagar_a_medio Impresiones_exchange Subastas
Cliente
jjj 180.00 543369 28411507
kkk 21.59 28758 222077
j
Fill_rate ECPM_medio
Cliente
jjj 2.011667 0.331667
kkk 12.990000 0.756667
Option 2
Another way of doing this would be to build an dict
of functions, and pass it to groupby.agg
-
f = dict.fromkeys(m, 'mean')
f.update(dict.fromkeys(, 'sum'))
df.groupby('Cliente').agg(f).to_csv('Cliente_x_mes.csv')
Cilente_x_mes.csv
Cliente,Importe_a_pagar_a_medio,Impresiones_exchange,Subastas,Fill_rate,ECPM_medio
jjj,180.0,543369,28411507,2.0116666666666667,0.3316666666666667
kkk,21.59,28758,222077,12.99,0.7566666666666667
Upvotes: 2