Pandas中的loc筛选后赋值:loc[筛选条件][‘列名‘]、loc[筛选条件,‘列名‘]、loc[筛选条件,[‘列名‘]]之间的区别

一、区别

  1. loc[筛选条件]['列名']

    • 先返回一个Series对象,再选择指定的列。
    • 对于Series对象,赋值操作不会修改原始DataFrame中的值,而是创建一个新的Series对象。因此,这种方式不会成功对原始DataFrame进行赋值操作。
  2. loc[筛选条件,'列名']

    • 返回一个Series对象。
    • 使用逗号将筛选条件和列名分隔开,不返回Series对象,而是直接对DataFrame进行赋值操作。
  3. loc[筛选条件,['列名']]

    • 返回一个DataFrame对象。

*使用loc对dataframe中的指定数据进行赋值时,第一种写法赋值失败,可以选第二种或第三种写法。第二种写法返回一个Series对象,第三种写法返回一个DataFrame对象。

二、示例

表: Employees

列名类型
employee_idint
namevarchar
salaryint

employee_id 是这个表的主键(具有唯一值的列)。
此表的每一行给出了雇员id ,名字和薪水。

编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 ‘M’ 开头,那么他的奖金是他工资的 100% ,否则奖金为 0 。

返回的结果按照 employee_id 排序。

示例 :

输入:Employees 表:

employee_idnamesalary
2Meir3000
3Michael3800
7Addilyn7400
8Juan6100
9Kannon7700

输出:

employee_idbonus
20
30
77400
80
97700

解释:
因为雇员id是偶数,所以雇员id 是2和8的两个雇员得到的奖金是0。
雇员id为3的因为他的名字以’M’开头,所以,奖金是0。
其他的雇员得到了百分之百的奖金。

查询:

  1. loc[筛选条件]['列名']
import pandas as pd

def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame:
    # 增加一个奖金列
    employees['bonus'] = 0

    employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M')]['bonus'] = employees['salary']*2
    #employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M'),'bonus'] = employees['salary']*2
    #employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M'),['bonus']] = employees['salary']*2

    print(employees)


2. loc[筛选条件,'列名']

import pandas as pd

def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame:
    # 增加一个奖金列
    employees['bonus'] = 0

    #employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M')]['bonus'] = employees['salary']*2
    employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M'),'bonus'] = employees['salary']*2
    #employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M'),['bonus']] = employees['salary']*2

    print(employees)

在这里插入图片描述
3. loc[筛选条件,['列名']]

import pandas as pd

def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame:
    # 增加一个奖金列
    employees['bonus'] = 0

    #employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M')]['bonus'] = employees['salary']*2
    #employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M'),'bonus'] = employees['salary']*2
    employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M'),['bonus']] = employees['salary']*2

    print(employees)

在这里插入图片描述

-------------------------------------------分割线------------------------------------------------------
本例完整代码:

import pandas as pd

def calculate_special_bonus(employees: pd.DataFrame) -> pd.DataFrame:
    # 增加一个奖金列
    employees['bonus'] = 0

    employees.loc[(employees['employee_id']%2==1) & (employees['name'].str[0]!='M'),['bonus']] = employees['salary']
    employees = employees[['employee_id','bonus']].sort_values(by='employee_id')

    return employees
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值