Pandas I
算是我第一次系统的学习pandas吧,把之前实践中用的很多知识点串了起来,当然,很多功能还是需要查文档。
索引
.loc
是通过标签来索引,标签包括 column label 和 row label。具体参数可以是:列表,切片,单一标签值。注意,这里的切片是左右闭合的。.iloc
是通过下标值来索引,参数也可以是 列表,切片和单一下标。注意,这里的切片是不包括右边的,即和python原生的切片相同。[]
只接收一个参数,该参数可以为:行下标的切片、单一列标签,列标签的列表关于 [] 索引,下图展示了不同的参数对应的输出,其中右下角 第一和第二的输入均为 single column label, 因此输出为 Series;第三个输入为slice,因此输出为DataFrame
![关于 [] 索引数据时,不同参数的返回](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F882d371e-ae83-457d-8520-e2ae7a9e4f4c%2FUntitled.png?table=block&id=5b361fde-ef3b-4f8a-8b61-f1b9fe7a0029&cache=v2)
注意:
- 不管是
.loc
还是.iloc
还是[]
都是操作,而不是函数,因此运算符为[]
。
- 一般不会使用
[]
来索引行, 有歧义。
- 利用 .loc 或者 [] 得到的DataFrame的顺序就是按照 参数顺序来的,所以可以通过 传递 特定参数的顺序来改变 顺序。例如,根据 Name 字符串长度排序 可以有
babynames.loc[babynames["Name"].str.len().sort_values().index]
- 除了上述三种方式之外,还可以通过 . 运算符来索引列,但此时列名不能有 空格。
数据结构
pandas 有三种数据结构,分别是
DataFrame,Series,Index
,其中 DataFrame 可以看作是一系列共享 Index 的Series。注意:Index的值可以是不唯一的,即可以重复
当索引单列数值的时候,很容易得到一个Series对象,但是此时如如果想得到 DataFrame对象,可有如下方法:

条件选择
.loc
和 []
可以通过 bool 来索引。即通过 df[bool_list]
和 df.loc[bool_list]
来选取 boollist中为True的行。至于 bool_list 如何得到,一般有如下几种方法:
- ==, > , < ,简单根据某列值 和 某 特定值 的关系来得到。例如
elections2.loc[elections["%"] > 50, ["Candidate", "Year"]]
- .isin,判断列值是否在 某个集合中
a_parties = ["Anti-Masonic", "American", "Anti-Monopoly", "American Independent"] elections[elections["Party"].isin(a_parties)]
- .str.startwith, 判断字符串是否以某字符开头
elections[elections["Party"].str.startswith("A")]
此外,还有如下两种按照条件选取的方式:
- .query,比较复杂,可以通过
@
关键字来获取python变量,如下例 2
# 例 1 elections.query('Year >= 2000 and Result == "win"') # 例 2 parties = ["Republican", "Democratic"] elections.query('Result == "win" and Party not in @parties')
- groupby.filter
一些内置函数
- size/shape 为属性,不是函数
- describe
- sample,用来抽样,通过参数来设置是否有放回。可以和别的操作进行链式操作
elections.query('Year == 2000') .sample(4, replace = True) .iloc[:, 0:2]
- value_counts,对某列特征值进行计数,返回为Series
elections["Candidate"].value_counts()
- uniques,查看某属性的所有取值,即去掉了重复值。返回一个numpy.ndarray
elections["Party"].unique()
- sort_values, 根据某一属性进行排序
elections.sort_values("%", ascending = False)