Python 如何在dataframe中创建具有多个条件的新列,同时能够扩展条件?

Python 如何在dataframe中创建具有多个条件的新列,同时能够扩展条件?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个如下所示的数据帧: df: 如何基于其他列的多个条件创建具有特定值的新列 例如: 如果name列等于apple,date列等于today,type列等于a,则新列id等于1 或 如果name列等于banana,date列等于today,type列等于b,则新列id等于2 新df将如下所示: name date type id banana 2018-08-18 00:00:00 b

我有一个如下所示的数据帧:

df:

如何基于其他列的多个条件创建具有特定值的新列

例如:

如果
name
列等于
apple
date
列等于
today
type
列等于
a
,则新列
id
等于
1

如果
name
列等于
banana
date
列等于
today
type
列等于
b
,则新列
id
等于
2

新df将如下所示:

name      date                         type       id
banana    2018-08-18 00:00:00           b          2
我希望以后能够基于df中的列值添加更多子句,因此寻找一种可伸缩的方法

目前,我可以通过这样的一列和一个条件来实现这一点:

df.loc[df['name'].str.contains("Apple"),'id'] = 1
先谢谢你

编辑: 一直在尝试这段代码,但在某个地方出现语法错误,不确定在哪里

new_df=df[(df['name'].str.contains('apple'))和(df['type'].str.contains('a'))和((df['date']=today))]

  • 将“日期”转换为
    datetime
  • 使用
    np构建条件。选择
  • 分配列并删除无效的分配
  • 将“日期”转换为
    datetime
  • 使用
    np构建条件。选择
  • 分配列并删除无效的分配


  • 即使日期不是今天,第一行也被指定为1。此外,您可能希望声明一个“默认”id值,该值在不满足任何条件时被指定。查看
    numpy。选择
    。我修复了分配,并添加了新代码。@RustyShackleford,通过在此处添加
    id
    列,您具体想实现什么?您想要一个允许您按唯一名称、日期、类型组合进行分组的id吗?@AustinA该id的目标是,在代码的后面,我可以对某些行进行分组,并进一步对数据帧进行子集划分。第一行被分配为1,即使日期不是今天……此外,您可能需要声明一个“默认”id值,该值在不满足任何条件时分配。查看
    numpy。选择
    。我修复了分配,并添加了新代码。@RustyShackleford,通过在此处添加
    id
    列,您具体想实现什么?您想要一个允许您按唯一名称、日期、类型组合进行分组的id吗?@AustinA该id的目标是在代码的后面我可以对某些行进行分组,并进一步对数据帧进行子集划分。很好,这是一个清晰的
    np。选择
    问题,非常可读。(PS:将近100k;)+1如果有10种水果和10种类型,这难道不意味着你必须在
    np.select()中手动列出100行特定的行吗?如果是这样的话,这似乎是不可伸缩的。@AustinA所以你可以用两种方式来解释这个问题:1)根据条件显式分配ID,或2)为每个唯一的组合隐式分配ID。我假设了前者,你假设了后者。我会让OP来澄清他们想要什么。如果是后者,那么你是对的。@coldspeed我走的是明确的路线。每个条件都有一个与之关联的唯一ID。整体组合可以放大或缩小。很好,这是一个清晰的
    np。选择
    问题,非常可读。(PS:将近100k;)+1如果有10种水果和10种类型,这难道不意味着你必须在
    np.select()中手动列出100行特定的行吗?如果是这样的话,这似乎是不可伸缩的。@AustinA所以你可以用两种方式来解释这个问题:1)根据条件显式分配ID,或2)为每个唯一的组合隐式分配ID。我假设了前者,你假设了后者。我会让OP来澄清他们想要什么。如果是后者,那么你是对的。@coldspeed我走的是明确的路线。每个条件都有一个与之关联的唯一ID。整体组合可以按比例放大或缩小。
    
    df.loc[df['name'].str.contains("Apple"),'id'] = 1
    
    df['date'] = pd.to_datetime(df['date'], errors='coerce')
    
    today = pd.to_datetime('today')
    ids = np.select( 
        [
            df.name.eq('apple') & df.date.eq(today) & df['type'].eq('a'),
            df.name.eq('banana') & df.date.eq(today) & df['type'].eq('b')
        ],
        [1, 2],
        default=np.nan
    )
    
    df = df.assign(ids=ids).dropna(subset=['ids'])
    df
         name       date type  ids
    1  banana 2018-08-18    b  2.0