根据另一列中的变量将Pandas中的值分配给该列

时间:2018-07-31 07:19:47

标签: python pandas dataframe

我有以下熊猫数据框

  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"

此循环无法完成工作。我在这里寻求帮助

3 个答案:

答案 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]