第三章 索引

整章知识架构

一、索引器

索引器
  1. 通过表索引对表进行列索引
df['column_name']
df.column_name
df[['c1', 'c2']]
  1. 对于序列的行索引有字符串索引和整数索引两种方式
s['a'] # s是以字符串为索引的Series
s[1] # s是以整型为索引的Series
  1. 对DaFrame的行索引具有lociloc两种方式,分别是元素索引和位置索引。这两种方式也可以对Series使用
df.loc['index']
df.loc[['ind1', 'ind2']]
df.iloc[1]
df.iloc[1:2]

【练一练】

select_dtypes是一个实用函数,它能够从表中选出相应类型的列,若要选出所有数值型的列,只需使用.select_dtypes('number'),请利用布尔列表选择的方法结合DataFramedtypes属性在learn_pandas数据集上实现这个功能。

# 使用.loc结合布尔条件索引的方法
def select_dtypes(df,_type):
    if _type in ['number']:
        is_int = df.dtypes == int
        is_float = df.dtypes == float
        is_number = is_int | is_float
        ret = df.loc[:, is_number]
    elif _type in ['int']:
        is_int = df.dtypes == int
        ret = df.loc[:, is_int]
    elif _type in ['float']:
        is_float = df.dtypes == float
        ret = df.loc[:, is_float]
    return ret if ret.shape[1] > 0 else None
print(select_dtypes(df, 'number').columns)
print(select_dtypes(df, 'float').columns)
print(select_dtypes(df, 'int'))
  1. 通过 query方法使用查询表达式来进行数据查询
df.query('((School == "Fudan University")&'
         ' (Grade == "Senior")&'
         ' (Weight > 70))|'
         '((School == "Peking University")&'
         ' (Grade != "Senior")&'
         ' (Weight > 80))')
  1. 通过sample函数可以对表进行随机抽样
df_sample.sample(3, replace = True, weights = df_sample.value)

二、多级索引

多级索引
# from_tuples
my_tuple = [('a','cat'),('a','dog'),('b','cat'),('b','dog')]
pd.MultiIndex.from_tuples(my_tuple, names=['First','Second'])
# from_arrays
my_array = [list('aabb'), ['cat', 'dog']*2]
pd.MultiIndex.from_arrays(my_array, names=['First','Second'])
# from_product
my_list1 = ['a','b']
my_list2 = ['cat','dog']
pd.MultiIndex.from_product([my_list1, my_list2], names=['First','Second'])

三、索引的常用方法

索引的常用方法

【练一练】

尝试在rename_axis中使用函数完成与例子中一样的功能。

df_ex.rename_axis(index=lambda x: str.upper(x)).head()

四、索引运算

索引运算

五、练习

Ex1:公司员工数据集

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


dataset
  1. 分别只使用queryloc选出年龄不超过四十岁且工作部门为DairyBakery的男性。
  2. 选出员工ID号 为奇数所在行的第1、第3和倒数第2列。
  3. 按照以下步骤进行索引操作:
  • 把后三列设为索引后交换内外两层
  • 恢复中间一层
  • 修改外层索引名为Gender
  • 用下划线合并两层行索引
  • 把行索引拆分为原状态
  • 修改索引名为原表名称
  • 恢复默认索引并将列保持为原表的相对位置
# 问题1
dpt = ['Dairy', 'Bakery']
df.loc[(df.age<=40)&df.department.isin(dpt)&(df.gender=='M')].head(3)
# 问题2
df.iloc[(df.EmployeeID%2==1).values,[0,2,-2]].head()
# 问题三
# 把后三列设为索引
df_ = df.set_index(['department', 'job_title', 'gender'])
# 交换内外两层
df_ = df_.swaplevel(0,2, axis=0)
# 恢复中间一层
df_ = df_.reset_index(level=1, drop=False)
# 把外层索引名改为Gender
df_.rename_axis(index={'gender':'Gender'})
# 用下划线合并两层索引
df_.index = df_.index.map(lambda x:'_'.join(x))
# 拆分为原状态
df_.index = df_.index.map(lambda x:tuple(x.split('_')))
# 修改索引名为原表名称
df_ = df_.rename_axis(index=['gender','department'])
# 恢复默认
df_ = df_.reset_index().reindex(df.columns, axis=1)

Ex2:巧克力数据集

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

  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的样本。
# 将\n替换为空格
df.columns = [' '.join(i.split('\n')) for i in df.columns]
# 挑选
df['Cocoa Percent'] = df['Cocoa Percent'].apply(lambda x:float(x[:-1])/100)
df.query('(Rating<3)&(`Cocoa Percent`>`Cocoa Percent`.median())').head(3)
idx = pd.IndexSlice
exclude = ['France', 'Canada', 'Amsterdam', 'Belgium']
# 将Review Date和Company Location设置为索引
res = df.set_index(['Review Date', 'Company Location']).sort_index(level=0)
res.loc[idx[2012:,~res.index.get_level_values(1).isin(exclude)],:].head(3)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容