题目
现有一份公司员工数据集:
1
2
| df = pd.read_csv('../data/company.csv')
df.head(3)
|
- 分别只使用
query
和loc
选出年龄不超过四十岁且工作部门为Dairy
或Bakery
的男性。 - 选出员工
ID
号为奇数所在行的第1、第3和倒数第2列。 - 按照以下步骤进行索引操作:
- 把后三列设为索引后交换内外两层
- 恢复中间层索引
- 修改外层索引名为
Gender
- 用下划线合并两层行索引
- 把行索引拆分为原状态
- 修改索引名为原表名称
- 恢复默认索引并将列保持为原表的相对位置
第 1 问
使用query
1
| df.query('(age <= 40) & (department in ["Dairy", "Bakery"]) & (gender == "M")')
|
使用loc
1
2
3
4
5
| condition_1 = df.age <= 40
condition_2_1 = df.department == "Dairy"
condition_2_2 = df.department == "Bakery"
condition_3 = df.gender == "M"
df.loc[condition_1 & (condition_2_1 | condition_2_2) & condition_3]
|
第 2 问
题目里这句有点不好理解: 选出员工ID
号为奇数所在行的第1、第3和倒数第2列。
我理解的是:
- 员工
ID
号为奇数 - 选出这些记录后, 输出第1、第3和倒数第2列的值
1
| df.loc[df.EmployeeID % 2 != 0].iloc[:, [1, 3, -2]]
|
第 3 问
把后三列设为索引后交换内外两层
1
2
3
| # 把后三列设为索引
index_list = df.iloc[0,-3:].index.to_list()
df.set_index(index_list, inplace=True)
|
1
2
| # 交换内外两层, 我理解的是交换第1个索引和第3个索引的位置
df = df.swaplevel(0, 2, axis=0)
|
恢复中间层索引
1
2
3
| # 我理解的是, 把第2个索引再变成正常的列
# 这个只是删除索引, 错的: df = df.droplevel(1, axis=0)
df = df.reset_index(["job_title"])
|
修改外层索引名为Gender
1
| df.rename_axis(index={'gender': 'Gender'}, inplace=True)
|
用下划线合并两层行索引
1
2
3
4
5
| new_idx = df.index.map(lambda x: ('_'.join(x)))
df.index = new_idx
df.head()
|
把行索引拆分为原状态
1
2
3
4
5
| new_idx = df.index.map(lambda x: tuple(x.split('_')))
df.index = new_idx
df.head()
|
修改索引名为原表名称
1
| df.index.set_names(["gender", "department"], inplace=True)
|
恢复默认索引并将列保持为原表的相对位置
1
2
| df = df.reset_index()
df = df.iloc[:, [3, 4, 5, 6, 1, 2, 0]]
|