python - 按对象遍历大熊猫组
问题描述
我需要一些大熊猫问题的帮助。
由于很多人要求获得真实的输入和真实的期望输出才能回答这个问题,所以我有以下数据框
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%)中的每一个做出了贡献。类别列采用以下值:
如果用户执行了 %_exercises_accum = 0,则为 0。
如果用户执行了 %_exercises_accum < 50 且 > 0,则为 1。
如果用户执行了 %_exercises_accum = 50,则为 50。
如果用户执行了 %_exercises_accum = 80,则为 80。
如果用户执行了 %_exercises_accum = 90,则为 90。
依此类推,因为有很多案例是为了确定谁贡献了每个月练习总数的百分比。
我已经确定了所有的案例和必须采取的所有价值观。
基本上,我使用for 循环和两个主要的 ifs遍历数据框:
如果(df.iloc[i][date] == df.iloc[i][date].shift()):
计算以确定从同一月份组的第二行到最后一行的用户贡献的百分比或百分比(因为同一用户可以贡献所有百分比,或多个百分比)
别的:
计算以确定每个月组的第一个成员贡献的练习百分比。
计算包括:
使用 shift() 查看上一行中类别列的值。
在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 的行表示该用户正在参与创建:
508090:一个月总锻炼量的 50%、80% 和 90%。
8090:一个月内完成 80% 和 90% 的锻炼。
有谁知道如何通过按对象遍历组来简化这个 for 循环?
非常感谢!
解决方案
鉴于您不知道您希望完成什么计算,这是我对您要查找的内容的最佳猜测。但是,我要重申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 ###
推荐阅读
- java - 如何在 JCOP javacard shell 脚本中编写一个简单的 for 循环?
- pandas - 根据其中一列的条件制作数据框;需要知道正确的语法
- java - 将 Enum.values() 转换为数组
使用 Kotlin 中的通用函数 - list - 如何从球拍中的单词列表中选择一个随机单词?
- android - 无法构建 Android 应用程序。获取“模块是使用不兼容的 Kotlin 版本编译的”错误
- android - 如何从私钥制作 X 签名?安卓
- postgresql - 在 PostgreSQL 中确定一个值与另一个值的相似性
- r - glmnet:提供模型与提供预测
- java - 如何使用java将镶木地板文件转换为csv
- reactjs - 使用静态类作为 Enum 来简化 React 组件 Typescript 中的 props