我有以下熊猫数据框
df= SlNo Size
1 2
2 3
3 1
4 4
我根据属性是小于2,等于2还是大于2创建了第二列-Size簇
df[['attribute']]=0
我想为属性列分配值,以便小于2的值被赋予V1,等于2的值被赋予V2,大于2的值被赋予V3。
SlNo Size attribute
1 2 V2
2 3 V3
3 1 V1
4 4 V3
我尝试了以下循环
if df.Size<=1:
df.attribute="V1"
elif df.Size<=2 & df.Size>1:
df.attribute="V2"
else df.attribute= "V3"
此循环无法完成工作。我在这里寻求帮助
答案 0 :(得分:2)
df['attribute'] = df['Size'].apply(lambda x: 'V1' if x<2 else 'V2' if x==2 else 'V3')
答案 1 :(得分:1)
您可以定义函数:
my_function <- function(df, start = 2000, end = 2018) {
for(i in start:end) {
df[[paste0("ges_", i)]] <- df[[paste0("gesbKU3_", i)]] + df[[paste0("bKUe3_", i)]] + df[[paste0("bKSch_", i)]]
}
return(df)
}
# my_function(df) -> supply your data frame
并应用您的功能:
def myFun(row):
if row['Size']<2: return 'V1'
elif row['Size']==2: return 'V2'
else: return 'V3'
然后:
df.loc[:, 'attribute']=df.apply(myFun, axis=1)
输出:
print(df)
答案 2 :(得分:1)
使用cut
,优势是categorical
列可节省内存并轻松添加新垃圾箱:
df['attribute'] = pd.cut(df['Size'], bins=[-np.inf,1,2, np.inf], labels=['V1','V2', 'V3'])
print (df)
SlNo Size attribute
0 1 2 V2
1 2 3 V3
2 3 1 V1
3 4 4 V3
print (df['attribute'])
0 V2
1 V3
2 V1
3 V3
Name: attribute, dtype: category
Categories (3, object): [V1 < V2 < V3]