Pandas如何根据多条件筛选行并创建新列存储指定值
多条件筛选DataFrame并创建新列的正确实现方案
需求说明
基于现有DataFrame创建新列new_column:当Age为19或21,且Stream为Math或Commerce时,取值为对应行的hours;其余情况取值为0。
示例数据
import pandas as pd record = { 'Name': ['Ankit', 'Amit', 'Aishwarya', 'Priyanka', 'Priya', 'Shaurya' ], 'Age': [21, 19, 20, 18, 17, 21], 'Stream': ['Math', 'Commerce', 'Science', 'Math', 'Math', 'Science'], 'Percentage': [88, 92, 95, 70, 65, 78], 'hours': [1,2,3,4,5,6] } df = pd.DataFrame(record)
尝试过的错误代码
代码1(合并方式)
options1 = ['Math', 'Commerce'] options2 = [21,19] dataframe1 = df[(df['Stream'].isin(options1)) & (df['Age'].isin(options2))] dataframe1['new_column'] = dataframe1['hours'] df = pd.merge(df, dataframe1, on='Name', how='left')
问题:合并后会生成重复列(如Age_x、Age_y),未匹配行的new_column为NaN而非0,需额外处理空值,步骤冗余。
代码2(apply方式)
df['New'] = df['hours'] df_bkp.loc[:,['New']] = df_bkp[['Stream','Age','New']].apply(lambda x: 0 if (x.Stream in ['Math','Commerce'] & (x.Age in [19,21])) else df_bkp['New'], axis=1 )
问题:语法错误(&是位运算符,此处应使用and),且apply遍历行效率低下,引用df_bkp['New']会返回整列而非当前行值,逻辑错误。
期望输出
Name Age Stream Percentage hours new_column Ankit 21 Math 88 1 1 Amit 19 Commerce 92 2 2 Aishwarya 20 Science 95 3 0 Priyanka 18 Math 70 4 0 Priya 17 Math 65 5 0 Shaurya 21 Science 78 6 0
正确简化实现方案
推荐使用矢量化操作,比apply效率更高,代码简洁易读:
方法1:numpy.where(最直观)
import numpy as np condition = (df['Age'].isin([19, 21])) & (df['Stream'].isin(['Math', 'Commerce'])) df['new_column'] = np.where(condition, df['hours'], 0)
方法2:pd.Series.where
condition = (df['Age'].isin([19, 21])) & (df['Stream'].isin(['Math', 'Commerce'])) df['new_column'] = df['hours'].where(condition, 0)
方法3:布尔索引赋值
df['new_column'] = 0 # 先默认设为0 condition = (df['Age'].isin([19, 21])) & (df['Stream'].isin(['Math', 'Commerce'])) df.loc[condition, 'new_column'] = df.loc[condition, 'hours']
以上三种方法均可高效实现需求,无逻辑或语法问题。
内容的提问来源于stack exchange,提问作者technical
相关产品推荐
相关产品推荐

