Joyful Pandas 索引 练习3.1 公司员工数据集

题目

现有一份公司员工数据集:

1
2
df = pd.read_csv('../data/company.csv')
df.head(3)
  1. 分别只使用queryloc选出年龄不超过四十岁且工作部门为DairyBakery的男性。
  2. 选出员工ID号为奇数所在行的第1、第3和倒数第2列。
  3. 按照以下步骤进行索引操作:
  • 把后三列设为索引后交换内外两层
  • 恢复中间层索引
  • 修改外层索引名为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列。

我理解的是:

  1. 员工ID号为奇数
  2. 选出这些记录后, 输出第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]]