首页 > 解决方案 > 按对象遍历大熊猫组

问题描述

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

由于很多人要求获得真实的输入和真实的期望输出才能回答这个问题,所以我有以下数据框

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% 的用户的百分比。

-为了做到这一点,我想创建一个新列,称为类别,稍后将用于计算有多少用户对 3 个百分比(50%、80% 和 90%)中的每一个做出了贡献。类别列采用以下值:

依此类推,因为有很多案例是为了确定谁贡献了每个月练习总数的百分比。

我已经确定了所有的案例和必须采取的所有价值观。

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

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

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

别的:

计算以确定每个月组的第一个成员贡献的练习百分比。

计算包括:

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

  2. 在for里面做while循环,因为当一个用户突然达到很大比例的时候,我们需要回去找同月的用户,把他们的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% 的锻炼。

有谁知道如何通过按对象遍历组来简化这个 for 循环?

非常感谢!

标签: pythonpandaspandas-groupby

解决方案


鉴于您不知道您希望完成什么计算,这是我对您要查找的内容的最佳猜测。但是,我要重申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 ###

推荐阅读