检查数字范围并在pandas数据框中的新列中写入值

时间:2018-07-15 15:01:36

标签: python-3.x pandas

我需要遍历“ 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

肯定有一种更简单的方法吗?

3 个答案:

答案 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.selectbetween对您来说是一个不错的选择:

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