Python dataframe根据现有列生成新的列np.where +apply,map

可以多个条件,条件用括号

result['EMX035']=np.where((result['EMX035_1']==1) | (result['EMX035_2']==1) ,1,0)


dataframe 根据某列的值生成新的列
df2['是否逾期']=df2.apply(lambda x:0 if x.应付日期>today_time else 1,axis=1)
df2['是否到期90天']=(today_time - df2.应付日期).map(lambda x:1 if x.days >= 90 else 0)

<think>嗯,用户问的是numpy的np.where和pandas的df.where之间的区别以及它们的使用场景。首先我需要回忆这两个函数的具体用法和功能。 记得np.where是一个三元表达式,类似于条件 ? 真值 : 假值。它的结构是np.where(条件, 满足时的值, 不满足时的值)。比如当条件为真时返回第二个参数,否则返回第三个参数。这个函数在numpy和pandas中都可以用,但主要是numpy的函数。 而pandas的df.where则是另一种用法。根据引用[2]里的说明,df.where(cond, df2)其实等价于np.where(cond, df, df2)。但这里的参数顺序可能需要注意,因为df.where默认情况下,如果条件不满足,会用NaN来填充,除非指定了other参数。比如,当使用df.where(条件)时,不满足条件的元素会被替换为NaN,而如果加上df.where(条件, other=替代值),就会用替代值填充。这可能和np.where的参数顺序不同,因为np.where是条件、真值、假值,而df.where的参数是条件,然后other是替换的值,同时可能需要另一个DataFrame来替换。 举个例子,如果用户有一个DataFrame,想要根据条件替换值,用np.where的话,可能需要写成np.where(条件, 值1, 值2),而用df.where的话,则是df.where(条件, 值2),这样条件满足的位置保留原值,不满足的替换为值2。或者,如果需要同时替换两种情况,可能需要结合其他方法。 比如引用[4]中的例子,用iif(即np.where)来判断客户名称是否为A,如果是则取发货数量,否则0。这种情况下np.where比较直接。而如果用df.where的话,可能需要更复杂的步骤,或者结合mask方法。 另外,引用[2]提到df1.where(cond, df2)等价于np.where(cond, df1, df2),这说明df.where的参数顺序可能和np.where相反,或者需要两个数据框架来进行替换。这可能涉及到两个不同的结构,比如当cond为True时保留df1的值,否则使用df2的值。而np.where则是根据条件在两个值或数组之间选择。 接下来需要整理两者的主要区别: 1. 语法结构不同:np.where(condition, x, y)是条件满足选x,否则选y。而df.where(condition, other=inplace)则是条件满足保留原数据,否则替换成other的值。当需要替换整个元素时,可能需要另一个结构相同的DataFrame或标量。 2. 默认行为:df.where如果不指定other参数,默认替换为NaN,而np.where必须提供x和y,没有默认替换值。 3. 返回值类型:np.where返回的是numpy数组,而df.where返回的是DataFrame,保持索引和结构。 使用场景的话,当处理DataFrame时,如果希望保持DataFrame的结构,并且替换不满足条件的值为另一个DataFrame对应的值或者标量,可以用df.where。而如果需要在两个选项之间选择,或者处理的是numpy数组,或者需要更灵活的条件判断,可能用np.where更方便。 例如,在pandas中添加新时,如引用[1]中的例子,使用np.where根据总分生成评级,或者比较两个列生成新的标记。这种情况下,np.where可以直接在Series上操作,返回一个数组,然后赋值给新。而df.where可能更适合筛选或替换原DataFrame中的某些值,同时保持结构。 可能还要提到df.where和df.mask的区别,mask是条件为假时保留原值,而where是条件为真时保留原值。而np.where则同时处理两种情况。 总结两者的区别,np.where更灵活,适用于元素级别的条件选择,而df.where更适合在保持DataFrame结构的情况下进行条件替换,尤其是当需要替换其他DataFrame的值或者标量时。</think>### numpy的`np.where`与pandas的`df.where`核心差异 #### 1. **语法与功能差异** - **`np.where(condition, x, y)`** 三元表达式结构:根据条件选择`x`或`y`的值。 - 若`condition`为`True`,返回`x`;否则返回`y`[^1][^4]。 - 适用于数组或标量,**返回结果类型与`x`/`y`一致**(如数组、Series等)。 - 示例:根据总分判断等级: ```python df['总分评级'] = np.where(df['总分'] > 200, 'A等', 'B等') # 直接生成新 ``` - **`df.where(condition, other=NaN)`** 保留满足条件的原始数据,替换不满足的值: - 若`condition`为`True`,保留原值;否则替换为`other`(默认`NaN`)[^2]。 - 适用于**原地修改或替换为其他DataFrame/标量**。 - 示例:筛选总分大于200的行,其余标记为`NaN`: ```python df_filtered = df.where(df['总分'] > 200) # 不满足条件的行变为NaN ``` #### 2. **默认行为对比** | 函数 | 满足条件 | 不满足条件 | 返回值类型 | |-------------|--------------------|---------------------|------------------| | `np.where` | 返回`x` | 返回`y` | 与`x`/`y`一致 | | `df.where` | 保留原值 | 替换为`other`或`NaN` | 保持DataFrame结构| #### 3. **使用场景** - **`np.where`适用场景**: - 需要根据条件从两个选项中动态选择值(如生成新、标记数据)[^1][^4]。 - 对数组或Series进行元素级操作(如`df['new'] = np.where(cond, a, b)`)。 - **`df.where`适用场景**: - 过滤或清理DataFrame中的特定值(如将不满足条件的值设为`NaN`或替换为其他值)。 - 需要保持DataFrame结构时(如`df.where(cond, other=df2)`用另一个DataFrame填充)。 #### 4. **典型代码对比** ```python # np.where示例:根据条件生成新 df['语文评级'] = np.where(df['语文'] > df['数学'], '√', '×') # 直接返回结果 # df.where示例:保留总分>200的行,其余替换为"淘汰" df_filtered = df.where(df['总分'] > 200, other="淘汰") # 保持DataFrame结构[^2] ``` #### 5. **关联函数扩展** - `df.mask(condition, other)`:与`df.where`相反,条件为`False`时保留原值,为`True`时替换为`other`。 - `pd.Series.where`:对Series对象的条件操作,语法与`df.where`一致。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值