我需要一些大熊猫问题的帮助。
很多人要求拥有真实的输入和实际期望的输出以回答这个问题,因此它出现了:所以我有以下数据框
Date user cumulative_num_exercises total_exercises %_exercises
2017-01-01 1 2 7 28,57
2017-01-01 2 1 7 14.28
2017-01-01 4 3 7 42,85
2017-01-01 10 1 7 14,28
2017-02-02 1 2 14 14,28
2017-02-02 2 3 14 21,42
2017-02-02 4 4 14 28,57
2017-02-02 10 5 14 35,71
2017-03-03 1 3 17 17,64
2017-03-03 2 3 17 17,64
2017-03-03 4 5 17 29,41
2017-03-03 10 6 17 35,29
%_exercises_accum
28,57
42,85
85,7
100
14,28
35,7
64,27
100
17,64
35,28
64,69
100
- 列%_cercises是列的值(cumulative_num_exercises/total_exercises(*100 - 列%_exercises_accum是每个月的%_cercises 总和的值。(请注意,在每个月结束时,它达到值100(。
- 我需要计算出这些数据,在每个月内进行总练习的50%,80%和90%的用户百分比。
- 为了这样做,我认为创建了一个称为类别的新列,后来将用于计算3个百分比中每个用户的贡献(50%,80%和90%(。类别列采用以下值:
0如果用户做a%_ESCISES_ACCUM =0。
1如果用户做了%_ESCERCISES_ACCUM<50和> 0。
50如果用户做了a%_exercises_accum = 50。
80如果用户做a%_exercises_accum = 80。
90如果用户做a%_ESCISES_ACCUM =90。
等等,因为有很多情况是为了确定谁贡献了每个月练习总数的比例。
我已经确定了所有情况和必须采取的所有值。
基本上,我使用 for loop >两个主要的IFS :
,我使用遍历数据框if(df.iloc [i] [date] == df.iloc [i] [date] .shift(((:
计算以确定用户从第二行到同月的最后一行的百分比或百分比 (因为相同的用户可以贡献所有百分比,或者一个以上(
else:
计算以确定第一个练习的百分比每个成员月组贡献。
计算涉及:
使用Shift((。
查看上一行中类别列的值在for内部循环时做
- 50%,但没有达到。例如,在这种情况下:
日期%_exercises_accum 2017-01-01 1,24 2017-01-01 3,53 2017-01-01 20,25 2017-01-01 55,5
问题开头给定数据框的所需输出将包括与以前相同的列(日期,用户,cumulative_num_exercises,total_exercises,total_exercises,%_cercises和%_exercises_accum(加上类别列,这是:P>
category
50
50
508090
90
50
50
5080
8090
50
50
5080
8090
请注意,带有值的行:508090或8090,意味着该用户正在贡献创建:
508090:一个月内总练习的50%,80%和90%。
8090:一个月内的80%和90%的练习。
有人知道如何通过对象遍历组的组来简化循环?
非常感谢!
没有理解您要完成的计算,这是我对您想要的最佳猜测。但是,我会重新获得Datanovice的观点,即获得答案的最佳方法是提供样本输出。
您可以使用以下代码切片到每个唯一日期:
dates = ['2017-01-01', '2017-01-01','2017-01-01','2017-01-01','2017-02-02','2017-02-02','2017-02-02','2017-02-02','2017-03-03','2017-03-03','2017-03-03','2017-03-03']
df = pd.DataFrame(
{'date':pd.to_datetime(dates),
'user': [1,2,4,10,1,2,4,10,1,2,4,10],
'cumulative_num_exercises':[2,1,3,1,2,3,4,5,3,3,5,6],
'total_exercises':[7,7,7,7,14,14,14,14,17,17,17,17]}
)
df = df.set_index('date')
for idx in df.index.unique():
hold = df.loc[idx]
### YOUR CODE GOES HERE ###