我有一个数据框架,看起来像这样:
学生卡 | session_id | reading_level_id | st_week | end_week |
---|---|---|---|---|
1个 | 3334 | 3 | 3 | 3 |
1个 | 3335 | 2 | 4 | 4 |
2 | 3335 | 2 | 2 | 2 |
2 | 3336 | 2 | 2 | 3 |
2 | 3337 | 2 | 3 | 3 |
2 | 3339 | 2 | 3 | 4 |
...
每个学生ID有多个session_id,st_weeks和end_weeks。我试图按“ student_id”对数据进行分组,我想计算每个学生的最大(结束周)和最小(结束周)之间的差异。
旨在看起来像这样的输出:
学生卡 | 差异 |
---|---|
1个 | 1个 |
2 | 2 |
....
我对Python和Stack Overflow还是比较陌生,并且一直在尝试寻找合适的解决方案-希望对您有所帮助。
可能有一种更有效的方法来执行此操作,但是我将其分为几个单独的步骤进行分组,以获取每个id的最大值和最小值,然后创建一个新列来表示差异。randint()
在本示例中,我使用了numpy的函数,因为我无权访问示例数据框。
import pandas as pd
import numpy as np
# generate dataframe
df = pd.DataFrame(np.random.randint(0,100,size=(1200, 4)), columns=['student_id', 'session_id', 'st_week', 'end_week'])
# use groupby to get max and min for each student_id
max_vals = df.groupby(['student_id'], sort=False)['end_week'].max().to_frame()
min_vals = df.groupby(['student_id'], sort=False)['st_week'].min().to_frame()
# use join to put max and min back together in one dataframe
merged = min_vals.join(max_vals)
# use assign() to calculate difference as new column
merged = merged.assign(difference=lambda x: x.end_week - x.st_week).reset_index()
merged
student_id st_week end_week difference
0 40 2 99 97
1 23 5 74 69
2 78 9 93 84
3 11 1 97 96
4 97 24 88 64
... ... ... ... ...
95 54 0 96 96
96 18 0 99 99
97 8 18 97 79
98 75 21 97 76
99 33 14 93 79
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句