第三章 索引
一、索引器
1.表的列索引
df=pd.read_csv('data/learn_pandas.csv',usecols=['School','Grade','Name','Gender','Weight','Transfer'])
df['Name'].head()
解释:
1. usecols是什么意思:
pd.read_csv中的usecols函数实现读取指定列
2.df[‘Name’].head()
df[‘name’] #得到的是不包含列索引的Series结构
df[[‘name’]] #得到是包含列索引的DataFrame结构
df.name #得到是不包含列索引的Series结构
输出的地方
df=pd.read_csv('data/learn_pandas.csv',usecols=['School','Grade','Name','Gender','Weight','Transfer'])
df['School'].head()
#输出:
0 Shanghai Jiao Tong University
1 Peking University
2 Shanghai Jiao Tong University
3 Fudan University
4 Fudan University
Name: School, dtype: object
函数dtype( )
作用:结构化数组类型并加以使用
语法:numpy.dtype(object, align, copy)
参数 含义
Object 被转换为数据类型的对象。
Align 如果为true,则向字段添加间隔,使其类似 C 的结构体。
Copy 是否生成dtype对象的新副本,如果为flase,结果是内建数据类型对象的引用。
2.序列的行索引
取出两个索引之间的元素,并且这两个索引是在整个索引中唯一出现,则可以使用切片,同时需要注意切片会包含两个端点:
例子是:
s=pd.Series([1,2,3,4,5,6],index=['a','b','a','a','a','c'])
s['c':'b':-2]
输出是:
c 2
a 4
b 6
dtype: int64
!!!-2的作用:
s=pd.Series([1,2,3,4,5,6],index=['a','c','a','a','a','b'])
s['c':'b':2]
输出是:
#输出
c 2
a 4
b 6
dtype: int64
如果读取的两个索引的顺序和命令的索引顺序是一样的那么是正2,如果顺序相反则需要-2
!!!如果改为1是什么样子
#输出
运行耗时: 7毫秒
c 2
a 3
a 4
a 5
b 6
dtype: int64
!!!如果改为3呢
#输出
c 2
a 5
dtype: int64
如果是1那么读取的是从端点开始+1的所有元素;是2则读取从端点开始+2的所有元素,并且下一个元素也是+2;是3则读取从端点开始+3的元素,因为在读取下一个+3位置的元素已经超出端点了所以没有下一个输出。
3.loc索引器
对DataFrame的行进行选取,其中基于元素的是loc索引器,基于位置的是iloc索引器
看了一遍感觉理解了;
BUT!!!
练一练部分不能做出来:
df_demo.loc[df_demo.Grade.isin(['Freshman','Senior'])]
df_demo.loc[df_demo..select_dtypes(['Freshman','Senior'])].head()
df_demo.select_dtypes(df_demo.loc['Freshman','Senior']).head()
最后百度我的代码,感觉是对的
df_demo.select_dtypes(include=['bool']).head()
lambda:
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
4.iloc索引器
使用的话与loc类似,区别在于iloc是针对位置进行筛选的
5.query方法
支持把字符串形式的查询表达式传入query方法查询数据,表达式的执行结果必须返回布尔列表
6.随机抽样
sample函数可以对样本或特征进行随机抽样
二、多级索引
三、索引的常用方法
2.索引属性的修改
练一练:
#df_ex.rename_axis(("Change_Col", axis="columns"))
有问题!!!
样例代码也不好使!!!
3.索引的设置与重置
发现set_index如果没有设置append,则默认为false;
练习题
第一题:
1.query选出的是空
df.query('((age<=40)&''(job_title=="Dairy")&''(gender=="M")|''(job_title=="Bakery")&''(age<=40)&''(gender=="M"))')
loc运行出错
condition_1_1 = df_demo.job_title == 'Dairy'
condition_1_2 = df_demo.gender == 'M'
condition_1_3 = df_demo.age <= 40
condition_1 = condition_1_1 & condition_1_2 & condition_1_3
condition_2_1 = df_demo.job_title == 'Bakery'
condition_2 = condition_2_1 & condition_1_2 & condition_1_3
df_demo.loc[condition_1 | condition_2]
查看参考答案之后更正答案:
df.query("((age<=40)&(department=='Dairy')&(gender=='M'))|((department=='Bakery')&(age<=40)&(gender=='M'))").head()
loc部分不是很懂,找不到自己答案的错误
看了答案,容易理解
df.iloc[(df.EmployeeID%2==1).values,[0,2,-2]].head()
其中列数通过0,2,-2分别表示第一列,第三列,倒数第二列
练习题第二题
df.columns = [' '.join(i.split('\n')) for i in df.columns]
理解了答案,
join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串
split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
抄了答案,但是不明白错误,还在查
df = pd.read_csv('data/chocolate.csv')
df['Cocoa Percent'] = df['Cocoa Percent'].apply(lambda x:float(x[:-1])/100)
df.query('(Rating<3)&(`Cocoa Percent` > `Cocoa Percent`.median())').head(3)
菜鸡加油!