Data
JavaScript
x
14
14
1
client total avail used date
2
charles 5000 5000 0 2/1/2022
3
charles 8000 5000 3000 2/1/2022
4
charles 500 500 0 3/1/2022
5
cara 1000 100 900 3/1/2022
6
cara 2000 50 1550 2/1/2022
7
cara 500 0 500 2/1/2022
8
cara 100 0 100 3/1/2022
9
10
11
12
13
14
Desired
JavaScript
1
7
1
client used date
2
charles 0.23 2/1/2022
3
charles 0 3/1/2022
4
cara 0.84 2/1/2022
5
cara 1 3/1/2022
6
7
Doing
JavaScript
1
2
1
Groupby client and date; create calculated column ['used']/['total'] * 100
2
first create derived column
JavaScript
1
7
1
df["used"] = df["used)"]/['total'] * 100
2
3
df.groupby(['client','date'])
4
.agg({'used':'max'}).reset_index()
5
6
df["used"] = df["used)"]/['total'] * 100
7
Any suggestion is helpful
Advertisement
Answer
You aren’t using a correct aggregation function. You should be using sum
on both your “used” and “total” columns:
JavaScript
1
21
21
1
df = pd.DataFrame(
2
{
3
'client': ['charles', 'charles', 'charles', 'cara', 'cara', 'cara', 'cara'],
4
'total': [5000, 8000, 500, 1000, 2000, 500, 100],
5
'used': [0, 3000, 0, 900, 1550, 500, 100],
6
'date': ['2/1/2022', '2/1/2022', '3/1/2022', '3/1/2022', '2/1/2022', '2/1/2022', '3/1/2022']
7
}
8
)
9
10
tmp = df.groupby(['client', 'date']).agg({'used': 'sum', 'total': 'sum'})
11
tmp['used_frac'] = tmp['used'] / tmp['total']
12
tmp.reset_index(inplace=True)
13
tmp
14
15
# Out:
16
client date used total used_frac
17
0 cara 2/1/2022 2050 2500 0.820000
18
1 cara 3/1/2022 1000 1100 0.909091
19
2 charles 2/1/2022 3000 13000 0.230769
20
3 charles 3/1/2022 0 500 0.000000
21