一、区别
-
loc[筛选条件]['列名']
:- 先返回一个Series对象,再选择指定的列。
- 对于Series对象,赋值操作不会修改原始DataFrame中的值,而是创建一个新的Series对象。因此,这种方式不会成功对原始DataFrame进行赋值操作。
-
loc[筛选条件,'列名']
:- 返回一个Series对象。
- 使用逗号将筛选条件和列名分隔开,不返回Series对象,而是直接对DataFrame进行赋值操作。
-
loc[筛选条件,['列名']]
:- 返回一个DataFrame对象。
*使用loc对dataframe中的指定数据进行赋值时,第一种写法赋值失败,可以选第二种或第三种写法。第二种写法返回一个Series对象,第三种写法返回一个DataFrame对象。
二、示例
表: Employees
列名 | 类型 |
---|---|
employee_id | int |
name | varchar |
salary | int |
employee_id 是这个表的主键(具有唯一值的列)。
此表的每一行给出了雇员id ,名字和薪水。
编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 ‘M’ 开头,那么他的奖金是他工资的 100% ,否则奖金为 0 。
返回的结果按照 employee_id 排序。
示例 :
输入:Employees
表:
employee_id | name | salary |
---|---|---|
2 | Meir | 3000 |
3 | Michael | 3800 |
7 | Addilyn | 7400 |
8 | Juan | 6100 |
9 | Kannon | 7700 |
输出:
employee_id | bonus |
---|---|
2 | 0 |
3 | 0 |
7 | 7400 |
8 | 0 |
9 | 7700 |
解释:
因为雇员id是偶数,所以雇员id 是2和8的两个雇员得到的奖金是0。
雇员id为3的因为他的名字以’M’开头,所以,奖金是0。
其他的雇员得到了百分之百的奖金。
查询:
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