我有一些数据,我正在做特征工程。我试图编码分类特征,但没有成功。它只给了我一个值,vs 2。我看不出我的代码有什么问题,并在Pandas中尝试了许多不同的方法。
我尝试将LotShape特征转换为2个值,方法是将'IR 1'、'IR 2'和'IR 3'组合为一个值2,而'Reg'为1。但是,所有内容都返回为2。有人能看出我做错了什么吗?谢谢!
def irreg(df):
if 'IR1' or 'IR2' or 'IR3' in df['LotShape']:
return 2
else:
return 1
df['LotShape_encoded']=list(map(lambda x: irreg(df['LotShape']),df['LotShape']))
df.LotShape_encoded.value_counts()
2 1460
Name: LotShape_encoded, dtype: int64
原始值_counts是这样的:
Reg 925
IR1 484
IR2 41
IR3 10
Name: LotShape, dtype: int64
我甚至尝试了这个功能,但它不喜欢它:
def irreg(df):
for i in df['LotShape']:
if df['LotShape'] =='IR1' or df['LotShape'] =='IR2' or df['LotShape'] =='IR3':
i=2
else:
i=1
return df['LotShape']
df['LotShape_encoded'] = df.assign(lambda x: irreg(df['LotShape']))
它给了我
TypeError:DataFrame.assign()接受1个位置参数,但给出了2个
我现在很迷茫,不知道我错过了什么,谢谢!
2条答案
按热度按时间pprl5pva1#
您可以简单地使用
numpy.where
(或numpy.select
,如果您有两个以上的值):如果你不需要,不要使用
lambda
函数。这里有一个函数,它接受Series
作为参数(而不是你的变量名所暗示的DataFrame
)。在你的函数中,如果你的Series
包含'IRE1'或'IRE2'或'IRE3',你将返回2。除非你只有'Reg'值,否则函数将始终返回2:另一点:只有当你想动态创建一个新的列并链接到另一个pandas方法时才使用
assign
,否则不要使用它。更新
示例:
xoshrz7s2#
我刚想出来。谢谢。