我有一个看起来像这样的数据帧:
DF:
name date type
apple 2018-01-01 00:00:00 a
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(((]
- 将"date"转换为
datetime
- 使用
np.select
构建条件
分配 - 列并删除无效分配
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