【问题标题】:How to create dummy variables from predefined bins in python如何在 python 中从预定义的 bin 创建虚拟变量
【发布时间】:2022-01-11 13:02:32
【问题描述】:

我想根据预定义的 bin 从原始数据中创建一个包含虚拟变量的数据集。我尝试过使用循环和拆分,但效率不高。非常感谢您的帮助。

## original data
data_dict = {"Age":[29,35,42,11,43],"Salary":[4380,3280,8790,1200,5420],
            "Payments":[23190,1780,3400,12900,7822]}

df = pd.DataFrame(data_dict)
df

预定义的垃圾箱:

card_dict = {"Dummy Variable":["Age:(-inf,24)","Age:(24,35)","Age:(35,49)","Age:(49,60)","Age:(60,inf)",
            "Payments:(-inf,7654)","Payments:(7654,9088)","Payments:(9088,12055)","Payments:(12055,inf)",
            "Salary:(-inf,2300)","Salary:(2300,3800)","Salary:(3800,5160)",
            "Salary:(5160,7200)","Salary:(7200,inf)"]}

card = pd.DataFrame(card_dict)
card

我的代码如下:

# for numerical variables

def prepare_numerical_data(data, scard):
    """
    function to create dummy variables from numerical columns
    """
    # numerical columns
    num_df = df.select_dtypes(exclude='object')
    num_cols = num_df.columns.values

    variable_names = list(set([val.split(':')[0] for val in scard['Dummy Variable']])) # to have the same columns used to create the scorecard
    num_variables = [x for x in variable_names if x in num_cols] # select numerical variables only
    for i in num_variables:
        for j in scard['Dummy Variable']:
            if j.split(":")[0] in num_variables:
                for val in data[i].unique():
                    if (val > (float(j.split(':')[1].split(',')[0][1:]))) & (val <= (float(j.split(':')[1].split(',')[1][:-1]))):
                        data.loc[data[i] == val, j] = 1
                    else:
                        data.loc[data[i] == val, j] = 0
        
        return data

结果如下:

result_df = prepare_numerical_data(df,card)
result_df

薪水和付款列的结果不正确。该函数没有为两列创建正确的假人,就像它为年龄所做的那样。我该如何纠正?

【问题讨论】:

  • 更改 bin 定义的格式并使用 pandas.cut
  • 垃圾箱已经生成。我需要检查该值是否在 bin 内,并通过为给定的 bin 创建虚拟对象来返回 1 else 0。
  • 你可以通过cut传递现有的bins和labels,它会做映射值->bin->bin name

标签: python pandas dummy-variable


【解决方案1】:

这对我有用。最初我的代码没有遍历数据框中的每一列。

def create_dummies(data, card):
    # specify  numerical and categorical columns
    num_df = data.select_dtypes(exclude='object')
    cat_df = data.select_dtypes(exclude=['float','int'])
    num_cols = num_df.columns.values
    cat_cols = cat_df.columns.values

    # create dummies for numerical columns
    for j in num_df.columns:
        all_value = num_df[j].values
        
        for variable_v in all_value:

            for i in card["Dummy Variable"].values:
                if i.split(":")[0] in num_cols:
                    var1 = i.split(":")
                    val1 = float(var1[1].strip("()").strip("[]").split(",")[0])

                    val2 = float(var1[1].strip("()").strip("[]").split(",")[1])
                    variable = var1[0]

                    if variable.lower() == j.lower():
                        if variable_v >= val1 and variable_v < val2:

                            num_df.loc[num_df[j] == variable_v, i] = 1

                        else:
                            num_df.loc[num_df[j] == variable_v, i] = 0
    return num_df

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 2016-04-24
    • 2012-09-27
    • 2012-07-20
    • 2023-03-27
    • 2015-08-11
    • 2017-04-23
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多