我需要遍历“ movies_rated”列,根据条件检查该值,然后在新创建的“ expert_level”列中写入一个值。当我测试数据的子集时,它可以工作。但是,当我针对整个日期集运行它时,只会填充值1。
&T
这是一个示例数据框。
for num in df_merge['movies_rated']:
if num in range(20,31):
df_merge['expert_level'] = 1
elif num in range(31,53):
df_merge['expert_level'] = 2
elif num in range(53,99):
df_merge['expert_level'] = 3
elif num in range(99,202):
df_merge['expert_level'] = 4
else:
df_merge['expert_level'] = 5
肯定有一种更简单的方法吗?
答案 0 :(得分:3)
您可以构建一个IntervalIndex
,然后应用pd.cut
。我确定这是重复的,但我现在无法找到同时使用closed='left'
和.codes
的一个,尽管我确定它同时存在。
bins = pd.IntervalIndex.from_breaks([0, 20, 31, 53, 99, 202, np.inf], closed='left')
df["expert_level"] = pd.cut(movies, bins).codes
这给了我
In [242]: bins
Out[242]:
IntervalIndex([[0.0, 20.0), [20.0, 31.0), [31.0, 53.0), [53.0, 99.0), [99.0, 202.0), [202.0, inf)]
closed='left',
dtype='interval[float64]')
和
In [243]: df
Out[243]:
movies_rated expert_level
angie 88 3
chris 20 1
pine 35 2
benedict 55 3
alice 1203 5
spock 99 4
tony 2222 5
xena 847 5
请注意,我已经对此进行了设置,以使低于20的分数获得0值,因此可以将其与真正的高排名区分开。如果您确实希望将垃圾箱之外的所有内容都设为5,则可以直接将0重新映射为5,或者只是传递[20、31、53、99、202]的换行符,然后使用-1(表示“未分类”)到5。
答案 1 :(得分:1)
我认为带有pandas
功能np.select
的between
对您来说是一个不错的选择:
conds = [df.movies_rated.between(20,30), df.movies_rated.between(31,52),
df.movies_rated.between(53,98), df.movies_rated.between(99,202)]
choices = [1,2,3,4]
df['expert_level'] = np.select(conds,choices, 5)
>>> df
movies_rated expert_level
angie 88 3
chris 20 1
pine 35 2
benedict 55 3
alice 1203 5
spock 99 4
tony 2222 5
xena 847 5
答案 2 :(得分:0)
您可以使用apply
和一个函数来完成此操作:
def expert_level_check(num):
if 20<= num < 31:
return 1
elif 31<= num < 53:
return 2
elif 53<= num < 99:
return 3
elif 99<= num < 202:
return 4
else:
return 5
df['expert_level'] = df['movies_rated'].apply(expert_level_check)
手动遍历df较慢,建议阅读this