Python 如何在dataframe中创建具有多个条件的新列,同时能够扩展条件?
我有一个如下所示的数据帧: df: 如何基于其他列的多个条件创建具有特定值的新列 例如: 如果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
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