26

问题

我无法弄清楚如何根据其他两列中的值创建新的 DataFrame 列。我需要使用 if/elif/else 逻辑。但是我发现的所有文档和示例都只显示了 if/else 逻辑。这是我正在尝试做的一个示例:

代码

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

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

4

5 回答 5

52

如果您有多个分支语句,最好创建一个接受行的函数,然后将其应用到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)
于 2013-08-12T18:50:11.493 回答
42

我尝试了以下方法,结果要快得多。希望对其他人有帮助。

df['combo'] = 'other'
df.loc[df['mobile'] == 'mobile', 'combo'] = 'mobile'
df.loc[df['tablet'] == 'tablet', 'combo'] = 'tablet'
于 2015-12-18T04:02:18.653 回答
19

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
于 2019-02-20T21:37:02.253 回答
3

添加到 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'). 

每个真/假块可以依次再次嵌套。

另外,请注意&forANDing! (not 'and')

于 2019-06-10T09:08:06.510 回答
0

添加以应用 lambda 解决方案:

 df['combo'] = df.apply(lambda x: 'mobile' if x['mobile'] == 'mobile' else \
                                 ('tablet' if x[''mobile']== 'tablet' else 'other'), axis=1)

结构 :

df['column_name'] = df.apply(lambda x: 'value if true 1' if x['column_name_check_1'] == 'condition_1' else 
                                      ('value if true 2' if x['column_name_check_2'] == 'condition_2' else 
                                      ('value if true 3' if x['column_name_check_3'] == 'condition_3' else 'default_value')),axis=1)

注意:轴 1 用于格式值作为列/系列

于 2021-09-02T06:29:05.917 回答