我有一个pandas dataframe,格式如下:
| 用户ID|日期|帐簿ID|
| --------------|--------------|--------------|
| 1|2022年7月15日|10个|
| 1|2022年7月16日|十一|
| 1|2022年7月16日|十二岁|
| 1|2022年7月17日|十二岁|
从这个表中,我想得到的是每个用户连续每天的新BookId的数量。例如,根据上表,用户在2022-07-16阅读了两本新书,而在2022-07-17没有阅读新书,因为他/她在前一天已经阅读了一本新书。这是预期的结果:
| 用户ID|2022年7月16日|2022年7月17日|
| --------------|--------------|--------------|
| 1|第二章|0|
我觉得这个任务可以通过按UserId和Date对数据进行分组,然后使用apply lambda函数来完成。然而,我无法管理它。我最终得到了以下代码,它使用了for循环。有没有一种方法可以在没有循环的情况下用更短的代码实现这一点?
df = studentAnswers.groupby('StudentId')
df.apply(findObjDiff)
def findObjDiff(df):
print(df.StudentId.head(3))
dataDict = {}
dates = list(df.Date)
dates.sort()
for d in dates:
ixNext = dates.index(d) + 1
if(ixNext > len(dates)):
break
dateNext = dates[ixNext]
objListPrev = set(df[df.Date == d].ObjectiveId)
objListNext = set(df[df.Date == dateNext].ObjectiveId)
dataDict[df.StudentId] = {dateNext : {'Different': len(objListPrev - objListNext)}}
return dataDict
3条答案
按热度按时间b5buobof1#
使用
duplicated
和pivot_table
:仅考虑重复的连续天数:
输出:
xqnpmsa82#
下面是一个解决方案:
输出:
d4so4syb3#
结果