使用IF和Apply函数创建新列

时间:2018-10-02 06:59:27

标签: python pandas if-statement apply

我的年龄数据是浮动的,我想创建一个具有三个值的新类别列:老年人,儿童和成人。我定义了一个函数,并添加了 <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3652.6095451920282!2d90.38946702923724!3d23.72563358206513!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3755b8dd3d3673e7%3A0xf999f4771c24183e!2sInstitute+of+AppropriateTechnology!5e0!3m2!1sen!2sbd!4v1519796378399" width="100%" height="450" frameborder="0" style="border: 0"></iframe>来迭代现有df ['Age']列中的各个值。但是,我的成绩始终是“长辈”,只有一个独特的成绩。

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

2 个答案:

答案 0 :(得分:0)

Series.apply中添加参数axis=1以使用标量函数-按值处理:

def ages(a): 
    if (a > 50): 
        return 'Elder' 
    elif (a < 12): 
        return 'Child' 
    else: 
        return 'Adult' 

df['Agem']=df['Age'].apply(ages)

使用numpy.select的快速解决方案:

m1 = df['Age'] > 50
m2 = df['Age'] < 12

df['Agem']= np.select([m1, m2], ['Elder','Child'], default='Adult')

性能

np.random.seed(123)

df = pd.DataFrame(np.random.randint(100, size=1000), columns=['Age'])
#print (df)

def ages(a): 
    if (a > 50): 
        return 'Elder' 
    elif (a < 12): 
        return 'Child' 
    else: 
        return 'Adult' 

df['Agem']=df['Age'].apply(ages)

m1 = df['Age'] > 50
m2 = df['Age'] < 12

df['Agem1']= np.select([m1, m2], ['Elder','Child'], default='Adult')
#print (df)

In [157]: %timeit df['Agem']=df['Age'].apply(ages)
577 µs ± 37.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [158]: %timeit df['Agem1']= np.select([m1, m2], ['Elder','Child'], default='Adult')
244 µs ± 1.08 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

答案 1 :(得分:0)

正确使用pd.Series.apply

pd.Series.apply通过函数提供一系列的每个。因此,您无需在函数中使用iloc

def ages(a):          
    if a > 50:  
        return 'Elder'  
    elif a < 12:
        return 'Child'  
    else:
        return 'Adult'  

df['Agem'] = df['Age'].apply(ages)

改为使用pd.cut

更有效地,您可以使用pd.cut将您的年龄“分类”到类别中。这样做的好处是,您得到的系列将具有Categorical dtype,具有效率/存储优势。

df['Agem'] = pd.cut(df['Age'], bins=[0, 12, 50, np.inf],
                    labels=['Child', 'Adult', 'Elder'])

print(df)

   Age   Agem
0   10  Child
1   15  Adult
2   20  Adult
3   35  Adult
4   45  Adult
5   50  Adult
6   70  Elder

print(df.dtypes)

Age        int64
Agem    category
dtype: object