【发布时间】: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