Series
- series是一个像数组一样的一维序列,并伴有一个数组表示label,叫做index,默认的index是0,1,2…,当然也可以在创建Series时设定好index
1 | obj = pd.Series([4, 7, 5, -3]) |
- 使用numpy函数或类似的操作,会保留index-value的关系
1 | import numpy as np |
- 另一种看待series的方法,它是一个长度固定,有顺序的dict,从index映射到value,因此也可以用现有的dict来创建series
1 | sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon':16000, 'Utah': 5000} |
- pandas中的isnull和notnull函数可以用来检测缺失数据
1 | states = ['California', 'Ohio', 'Oregon', 'Texas'] |
- Series有个特色是自动按照index label来排序
1 | obj3 |
- series的index能被直接更改
1 | obj |
DataFrame
- 用Excel来理解DataFrame是更为直观的
- 构建一个dataframe的方法,用一个dcit,dict里的值是list
- dataframe也会像series一样,自动给数据赋index
1 | data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], |
- 如果指定一列的话,则会自动按指定的列排序
1 | pd.DataFrame(data, columns=['year', 'state', 'pop']) |
- 从DataFrame里提取一列的话会返回series格式,可以以属性或是dict一样的形式来提取
1 | frame['state'] |
- 如果是提取一行的话,需要用到loc,loc中使用index
1 | frame.loc[1] |
- 如果把list或array赋给column的话,长度必须符合DataFrame的长度。如果把一二series赋给DataFrame,会按DataFrame的index来赋值,不够的地方用缺失数据来表示
1 | frame['debt'] = 0 |
- 任何对series的改变,会反映在DataFrame上。除非我们用copy方法来新建一个。
- 把上面这种嵌套dcit传给DataFrame,pandas会把外层dcit的key当做列,内层key当做行索引
1 | pop = {'Nevada': {2001: 2.4, 2002: 2.9}, |
- 如果DataFrame的index和column有自己的name属性,也会被显示
1 | frame3.index.name = 'year'; frame3.columns.name = 'state' |
- index object是不可被修改的
1 | obj = pd.Series(range(3), index=['a', 'b', 'c']) |
- 所以这个index不仅像数组,还有点像set,但是与set不同的是,index是可以重复的
1 | obj = pd.Series(range(3), index=['a', 'c', 'c']) |
主要功能
重新索引:reindex
- reindex:重新生成一个更改index的obj,如果没有对应的index,则会引入数据缺失
1 | obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c']) |
- 对于DataFrame,reindex既可以更改row,也可以更改column
1 | frame = pd.DataFrame(np.arange(9).reshape(3, 3), |
删除记录
- 对于series,drop回返回一个新的object,并删去指定的axis的值
1 | obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e']) |
- 对于DataFrame,index能按行或列的axis来删除
- 删除行的,直接drop行的labels即可
- 删除列的,需指定axis = 1
1 | data = pd.DataFrame(np.arange(16).reshape(4, 4), |
- drop也可以不返回一个新的object,而是直接更改series or dataframe,设定inplace为True即可
1 | obj.drop('c', inplace=True) |
索引,选择,过滤
- Series,可以用整数或者label来选中行,用label来切片的时候,和python的切片不一样的在于,会包括尾节点:
1 | obj = pd.Series(np.arange(4.), index=['a', 'b', 'c', 'd']) |
- DataFrame,可以通过一个值或序列,选中一个以上的列,行选择的语法格式为data[:2],也有一些特别的用法,比如传入布尔数组
1 | data = pd.DataFrame(np.arange(16).reshape((4, 4)), |
- 还有一种方法是boolean dataframe
1 | data < 5 |
loc和iloc
- loc索引是通过labels
- iloc索引是通过整数
1 | data |
1 | * loc和iloc也可以进行切片 |
1 | data.loc[:'Utah', 'two'] |
算数与数据对齐
- 如果两个object相加,但他们各自的index并不相同,最后结果得到的index是这两个index的合集
- 在DataFrame中,数据对齐同时发生在行和列上
1 | s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e']) |
- 使用fill_value可以对缺失值进行填充,fill_value为0时,填充的值是原来的值
1 | df1.add(df2, fill_value=0) |
DataFrame和Series之间的操作
- series的index和dataframe的列匹配,向下按行进行广播
1 | frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), |
- 如果一个index既不在DataFrame的column中,也不再series里的index中,那么结果也是合集
1 | series2 = pd.Series(range(3), index=['b', 'e', 'f']) |
- 如果想要广播列,去匹配行,必须要用到算数方法
1 | frame |
函数应用和映射
- 把一个用在一维数组上的函数,应用在一行或一列上,要用到DataFrame中的apply函数
- 默认是应用在每一列,也可以设置axis来应用在每一行
1 | frame |
- 对于应用在每个元素的函数,需要applymap函数
- 比如下例中的将每个元素转成保留小数点两位的浮点数
1 | format = lambda x: '%.2f' % x |
排序和排名
- 使用sort_index函数来排序index,默认排的是index,也可以设置axis=1来排序column,默认是升序,也可以设置ascending为False为降序
1 | frame = pd.DataFrame(np.arange(8).reshape((2, 4)), |
- 用sort_values方法来排序值,缺失值会排在最后
- DataFrame通过by选择一列或者多列,多列的话是以list的形式传入
1 | obj = pd.Series([4, np.nan, 7, np.nan, -3, 2]) |
- rank函数表示在这个数在原来的Series中排第几名,有相同的数,取其排名平均(默认)作为值
1 | obj = pd.Series([7, -5, 7, 4, 2, 0, 4]) |
- dataframe 可以根据行或列来计算rank
1 | frame = pd.DataFrame({'b': [4.3, 7, -3, 2], |
重复
- 对于有重复的index或者column,可以使用is_unique来判断
1 | obj = pd.Series(np.arange(5), index=['a', 'a', 'b', 'b', 'c']) |
- 数据选择,对于有重复的label,会返回一个Series,否则返回值
1 | obj['a'] |
- 同样应用于DataFrame,如果有重复,返回DataFrame,否则返回Series
1 | df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'a', 'b', 'b', 'c']) |
值计数
- 可以从一维的Series中提取信息,使用unique函数,返回除去重复的还有哪些值
1 | obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c']) |
- value_counts能计算series中值出现的频率
1 | obj.value_counts() |
- isin 能实现一个向量化的集合成员关系检查,能用于过滤数据集,检查一个子集,是否在series的values中,或在dataframe的column中
1 | obj.isin(['b', 'c']) |
汇总和描述性统计
- 从series中提取单个值(比如sum或mean)
- 计算的时候,NA(即缺失值)会被除外,除非整个切片全是NA。我们可以用skipna来跳过计算NA
1 | df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5], |
- 还有idxmin和idxmax能返回最大最小的index,cumsum能进行累加
1 | df.idxmax() |
- describe能一下子产生多维汇总数据
- 对于非数值性的数据,describe能产生另一种汇总统计
1 | df.describe() |