在Pandas中使用ELIF创建列

时间:2013-08-12 18:47:01

标签: python pandas

问题

我无法根据其他两列中的值来确定如何创建新的DataFrame列。我需要使用if / elif / else逻辑。但我发现的所有文档和示例只显示if / else逻辑。以下是我想要做的一个示例:

代码

df['combo'] = 'mobile' if (df['mobile'] == 'mobile') elif (df['tablet'] =='tablet') 'tablet' else 'other')

我也愿意使用where()。只是找不到合适的语法。

4 个答案:

答案 0 :(得分:31)

我尝试了以下内容,结果更快。希望它对其他人有帮助。

df['combo'] = 'other'
df.loc[df['mobile'] == 'mobile', 'combo'] = 'mobile'
df.loc[df['tablet'] == 'tablet', 'combo'] = 'tablet'

答案 1 :(得分:26)

如果您有多个分支语句,最好创建一个接受行的函数,然后沿axis=1应用它。这通常比通过行迭代快得多。

def func(row):
    if row['mobile'] == 'mobile':
        return 'mobile'
    elif row['tablet'] =='tablet':
        return 'tablet' 
    else:
        return 'other'

df['combo'] = df.apply(func, axis=1)

答案 2 :(得分:4)

ELIF逻辑可以用np.select或嵌套的np.where来实现:

import numpy as np

df['combo'] = np.select([df.mobile == 'mobile', df.tablet == 'tablet'], 
                        ['mobile', 'tablet'], 
                        default='other')
# or 
df['combo'] = np.where(df.mobile == 'mobile', 'mobile', 
                       np.where(df.tablet == 'tablet', 'tablet', 'other'))

样本数据+输出:

   mobile  tablet   combo
0  mobile     bar  mobile
1     foo  tablet  tablet
2     foo     nan   other
3  mobile  tablet  mobile
4  mobile     nan  mobile
5     foo  tablet  tablet
6  mobile     bar  mobile
7  mobile  tablet  mobile
8  mobile     bar  mobile
9  mobile     nan  mobile

答案 3 :(得分:0)

添加到np.where解决方案:

df['col1']= np.where(df['col'] < 3, 1,np.where( (df['col'] >3 )& (df['col'] <5),2,3))

总体逻辑是:

np.where(Condition, 'true block','false block'). 

每个true / false块都可以再次嵌套。

另外,请注意&的{​​{1}}