代码之家  ›  专栏  ›  技术社区  ›  Raghavan vmvs

根据另一列中的变量将Pandas中的值赋给列

  •  1
  • Raghavan vmvs  · 技术社区  · 8 年前

    我有以下熊猫数据框

      df= SlNo Size 
           1     2     
           2     3
           3     1
           4     4
    

    我已经根据属性是小于2、等于2还是大于2创建了第二个列大小的集群

        df[['attribute']]=0
    

    我想给attribute列赋值,这样小于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 回复  |  直到 8 年前
        1
  •  1
  •   jezrael    8 年前

    使用 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]
    
        2
  •  2
  •   Ankur Paliwal    8 年前
    df['attribute'] = df['Size'].apply(lambda x: 'V1' if x<2 else 'V2' if x==2 else 'V3')
    
        3
  •  1
  •   Ala Tarighati    8 年前

    可以定义函数:

    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)
    

    输出:

       Size attribute
    0     2        V2
    1     3        V3
    2     1        V1
    3     4        V3