首页 > 解决方案 > 'If-Elif-Else' 函数返回真值不明确 - Pandas Dataframe

问题描述

尝试运行一个函数将房屋年龄分成某些类别,然后使用结果在原始数据框中创建一个新列。这是 IF 语句的代码:

def sort_age(data):
    if (data["housing_median_age"] > 40) : 
        return ('Cat 5')
    elif ((30 <= data["housing_median_age"]) & (data["housing_median_age"] <= 40)) : 
        return ('Cat 4')
    elif ((20 <= data["housing_median_age"]) & (data["housing_median_age"] < 30)) :
        return ('Cat 3')
    elif (10 <= data["housing_median_age"] < 20) : 
        return ('Cat 2')
    elif (0 <= data["housing_median_age"] < 10) : 
        return ('Cat 1')
    else:
        return ('None')


# Here's the code for the new column:
p1data['age_category'] = p1data.apply(lambda x: sort_age(p1data), axis = 1)


错误消息如下所示:

ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')

标签: pythonpandasif-statement

解决方案


要执行此类分类,请使用专用于这种情况的函数,即pd.cut。代码可以是:

p1data['age_category'] = pd.cut(p1data.housing_median_age,
    bins=[0, 10, 20, 30, 40.001, 200], right=False,
    labels=['Cat 1', 'Cat 2', 'Cat 3', 'Cat 4', 'Cat 5'])

细节:

  • bins垃圾箱边缘。请注意一些不规则性:所有值都是整数,但其中之一是40.001,提供该值40将被归类为Cat 4
  • right=False- 使箱子在右侧打开。

他的解决方案的优点是分配的名称只是Pandas 类别,即使它们的名称没有按字母顺序排列,它们的逻辑顺序也将在任何排序后保持。


推荐阅读