遍历逐组熊猫的分组

时间:2019-05-01 15:24:29

标签: python pandas pandas-groupby

我需要一些大熊猫问题的帮助。

许多人为了回答这个问题而要求提供真实的输入和真实的期望的输出,结果就这样: 所以我有以下数据框

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

-列%_exercises是该列的值(cumulative_num_exercises / total_exercises)* 100 -%_exercises_accum列是每月 的%_exercises之和的值。 (请注意,在每个月末,它会达到100。)

-我需要计算出这些数据,每个月贡献了50%,80%和90%锻炼的用户所占的百分比。

-为此,我考虑过创建一个名为category的新列,该列以后将用于计算为这三个百分比(50%,80%和90%)中的每个百分比贡献了多少用户。类别列采用以下值:

  • 0,如果用户执行了%_exercises_accum = 0。

  • 1,如果用户执行了%_exercises_accum <50和> 0。

  • 50,如果用户执行了%_exercises_accum = 50。

  • 80,如果用户执行了%_exercises_accum = 80。

  • 90,如果用户执行了%_exercises_accum = 90。

依此类推,因为有很多情况可以确定谁贡献了每月锻炼总数的百分比。

我已经确定了所有情况和必须采取的所有值。

基本上,我使用 for循环两个主要if 遍历数据框:

if(df.iloc [i] [date] == df.iloc [i] [date] .shift()):

计算以确定用户从同一个月组的第二行到最后一行所占的百分比      (因为同一用户可以贡献所有百分比,也可以贡献一个以上)

其他:

计算以确定第一个运动占哪个运动百分比 每个成员 月组贡献。

计算涉及:

  1. 使用shift()查看上一行中category列的值。

  2. while在for内循环,因为当用户突然达到一个很大的百分比时,我们需要在同一个月返回该用户,并将他们的category_column值更改为50,因为他们对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,%_ exercises和%_exercises_accum)以及类别列,该列如下: >

category
50
50
508090
90
50
50
5080
8090
50
50
5080
8090

请注意,值为508090或8090的行表示该用户正在创建:

  1. 508090:一个月内进行总锻炼的50%,80%和90%。

  2. 8090:每月进行80%和90%的锻炼。

有人知道如何通过逐个对象遍历一个组吗?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

不知道您希望完成什么计算,这是您所寻找的最好的猜测。但是,我要重申Datanovice's point,获得答案的最佳方法是提供示例输出。

您可以使用以下代码对每个唯一的日期进行切片:

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 ###