我有以下DataFrame badges
。 UserId
列包含同一用户的多个条目。我想获得给定Date
的每个UserId
的最小值BadgeName
。我创建了一个函数user_badge_dt
来执行相同的操作,但出现索引错误。需要注意的一点是,尽管所有用户的数据集都是相同的,但我仅对某些徽章而不是其他徽章得到此错误。我不知道为什么会这样。
徽章数据框架的一部分
UserId BadgeName Date
0 23 Curious 2016-01-12T18:44:49.267
1 22 Autobiographer 2017-01-12T18:44:49.267
2 23 Curious 2018-01-12T18:44:49.267
3 20 Autobiographer 2019-01-12T18:44:49.267
4 22 Autobiographer 2020-01-12T18:44:49.267
5 30 Curious 2020-01-12T18:44:49.267
功能
#Function to obtain UserId with the date-time of obtaining given badge for the first time
def user_badge_dt(badge_name):
#Creating DataFrame to obtain all UserId and date-Time of given badge
df = badges[['UserId','Date']].loc[badges.Name == badge]
#Obtaining the first date-time of badge attainment
v = df.groupby("UserId", group_keys=False)['Date'].nsmallest(1)
v.index = v.index.droplevel(1)
df['date'] = df['UserId'].map(v)
df.drop(columns='Date',inplace=True)
#Removing all duplicate values of Users
df.drop_duplicates(subset='UserId', inplace=True )
return df
错误
IndexError: Too many levels: Index has only 1 level, not 2
注意
在进一步检查中,我发现此行引起了错误
v.index = v.index.droplevel(1)
这是因为前面的代码行针对不同的徽章名称给出了不同的结果:
情况1:当代码对于给定的徽章正确运行时
df = badges [['UserId','Date']]。loc [badges.Name =='Autobiographer']
v = df.groupby(“ UserId”,group_keys = False)['Date']。nsmallest(1) 打印(v)
o / p:
1 22 2017-01-12T18:44:49.267
3 20 2019-01-12T18:44:49.267
(此输出具有index
,UserId
和给定徽章的最小值Date
)
情况2:当代码无法正确使用给定的徽章
df = badges [['UserId','Date']]。loc [badges.Name =='Curious']
v = df.groupby(“ UserId”,group_keys = False)['Date']。nsmallest(1) 打印(v)
o / p:
23 2016-01-12T18:44:49.267
30 2020-01-12T18:44:49.267
(此输出没有index
,这就是代码在下一行失败的原因。我不知道它是怎么回事。)
任何输入badge_name
的函数的预期输出应返回一个数据帧,其中包含给定徽章的UserId
和最小值Date
。如果我的功能不清楚,请提供另一种使用新功能的方法来实现此目的。
答案 0 :(得分:2)
我无法模拟您的错误,但我认为您的解决方案应使用DataFrame.sort_values
进行简化-然后让所有初次使用日期最少的用户:
badges['Date'] = pd.to_datetime(badges['Date'])
def user_badge_dt(badge_name):
#Creating DataFrame to obtain all UserId and date-Time of given badge
return (badges.loc[badges.BadgeName == badge_name, ['UserId','Date']]
.sort_values('Date')
.drop_duplicates(subset='UserId'))