DataWhale Pandas数据分析 Task03:索引

练习

Ex1:公司员工数据集

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

In [167]: df = pd.read_csv('data/company.csv')

In [168]: df.head(3)
Out[168]: 
   EmployeeID birthdate_key  age  city_name department      job_title gender
0        1318      1/3/1954   61  Vancouver  Executive            CEO      M
1        1319      1/3/1957   58  Vancouver  Executive      VP Stores      F
2        1320      1/2/1955   60  Vancouver  Executive  Legal Counsel      F
  1. 分别只使用queryloc选出年龄不超过四十岁且工作部门为DairyBakery的男性。
  2. 选出员工ID号 为奇数所在行的第1、第3和倒数第2列。
  3. 按照以下步骤进行索引操作:
  • 把后三列设为索引后交换内外两层
  • 恢复中间一层
  • 修改外层索引名为Gender
  • 用下划线合并两层行索引
  • 把行索引拆分为原状态
  • 修改索引名为原表名称
  • 恢复默认索引并将列保持为原表的相对位置

答案:

# 1.a
condition_1 = df['age'] <= 40
condition_2 = df['department'].isin(['Dairy', 'Bakery'])
condition_3 = df['gender'] == 'M'
condition = condition_1 & condition_2 & condition_3
df.loc[condition].head()
# 1.b
df.query('(age<=40) and (department == ["Dairy", "Bakery"]) and gender == "M"').head()
# 2
df.loc[df['EmployeeID']%2==1].iloc[:, [0, 2, -2]]
# 3.a
df_cp = df.set_index(['department', 'job_title', 'gender'])
df_cp = df_cp.swaplevel(0, 2, axis=0)
df_cp.head()
# 3.b
df_cp = df_cp.reset_index(['job_title'])
df_cp.head()
# 3.c
df_cp = df_cp.rename_axis(index={'gender': 'Gender'})
df_cp.head()
# 3.d
new_idx = df_cp.index.map(lambda x: x[0] + '_' + x[1])
df_cp.index = new_idx
df_cp.head()
# 3.e
new_idx = df_cp.index.map(lambda x: tuple(x.split('_')))
df_cp.index = new_idx
df_cp.head()
# 3.f
df_cp = df_cp.rename_axis(index=['gender', 'department'])
df_cp.head()
# 3.g(保持为原表的相对位置未完成)
df_cp = df_cp.reset_index()
df_cp.head()

参考答案:

# 3.g
# 通过矩阵的变形完成恢复原表相对位置
df_cp = df_cp.reindex(df.columns, axis=1)
df_cp.head()
df_cp.equals(df)

Ex2:巧克力数据集

现有一份关于巧克力评价的数据集:

In [167]: df = pd.read_csv('data/company.csv')

In [168]: df.head(3)
Out[168]: 
   EmployeeID birthdate_key  age  city_name department      job_title gender
0        1318      1/3/1954   61  Vancouver  Executive            CEO      M
1        1319      1/3/1957   58  Vancouver  Executive      VP Stores      F
2        1320      1/2/1955   60  Vancouver  Executive  Legal Counsel      F
  1. 把列索引名中的\n替换为空格。
  2. 巧克力Rating评分为1至5,每0.25分一档,请选出2.75分及以下且可可含量Cocoa Percent高于中位数的样本。
  3. Review DateCompany Location设为索引后,选出Review Date在2012年之后且Company Location不属于France, Canada, Amsterdam, Belgium的样本。
    答案:
# 1
df = df.rename(columns=lambda x: x.replace('\r\n', ' '), level=0)
df.head()
# 2
df['Cocoa Percent'] = df['Cocoa Percent'].str.strip('%').astype('float64')/100
condition_1 = df['Rating'] <= 2.75
condition_2 = df['Cocoa Percent'] >= df['Cocoa Percent'].median()
df[condition_1 & condition_2].head()
# 3(未完成)
df = df.set_index(['Review Date', 'Company Location'])
df.sort_index()

# 求Company Location的index
idx_all = df.index.get_level_values(1).unique()
idx_ex = pd.Index(['France', 'Canada', 'Amsterdam', 'Belgium'])
idx_in = idx_all.difference(idx_ex)
idx_2 = idx_in.values

# 求Review Date的index
idx_all = df.index.get_level_values(0).unique()
idx_1 = idx_all.values[idx_all.values > 2012]

# 构建Multi_index
multi_index = pd.MultiIndex.from_product([idx_1, idx_2]).values

参考答案:

# 2
df['Cocoa Percent'] = df['Cocoa Percent'].apply(lambda x:float(x[:-1])/100)
# 对于列名存在空格用``括起来
df.query('(Rating<3)&(`Cocoa Percent`>`Cocoa Percent`.median())').head(3)
# 3
idx = pd.IndexSlice
exclude = ['France', 'Canada', 'Amsterdam', 'Belgium']
res = df.set_index(['Review Date', 'Company Location']).sort_index(level=0)
# 通过IndexSlice对象进行索引,loc[idx[*,*],idx[*,*]]
# 其中*可以为索引,也可以为Series对象
# Series.isin()方法
res.loc[idx[2012:,~res.index.get_level_values(1).isin(exclude)],:].head(3)

心得体会

  • 这次打卡比较早,学习的效果还算不错
  • 等5个章节过后,把前五章涉及的方法进行汇总,方便之后使用时查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值