1. df.rank
df.rank针对指定的序列进行排序(从大到小或从小到大),并返回排名的序列(从第一名到最后一名)
rank有两个重要参数:ascending、method。
- ascending:为True时,表示按从小到大排列,即最小的为第一名,最大的为倒数第一名;ascending为False,则相反
- method:主要控制当两个数值相等时,如何排名。如考试得分,小明和小红都考了100分,两人都是第一名还是一个第一名,一个第二名。此时下一个得99分的是第三名,还是第二名呢?
- average:如下例,张三和李四并列第四名(同时占据第四、第五两个坑),那么两人的排名是4和5的平均值,下一个人是第6名
- max:如下例,张三和李四占据第4、第5两个坑,那么两人都是第5名(4/5较大排名那个),下一个人是第6名
- min:如下例,张三和李四占据第4、第5两个坑,那么两人都是第4名(4/5较小排名那个),下一个人是第6名
- dense:张三和李四并列第四名,但是下一个人是第5名
- first:张三和李四,谁先出现谁是第4名,另一个是第5名,下一个人是第6名
a = pd.Series([1, 2, 3, 4, 4, 6], index=['小明', '小红', '小张', '张三', '李四', '王五'])
a.rank(ascending=True, method='first')
小明 1.0
小红 2.0
小张 3.0
张三 4.0
李四 5.0
王五 6.0
dtype: float64
2. pd.pivot_table
pivot_table对应excel中的数据透视表。本章中所用df数据如下:
df.pivot_table有如下参数:
- values=None,
- index=None,
- columns=None,
- aggfunc=‘mean’,
- fill_value=None,
- margins=False,
- dropna=True,
- margins_name=‘All’,
- observed=False,
有些参数不常用就不赘述了,本章主要讲述几个很重要的参数
2.1 index
index即索引,其实透视图就是分组后聚合,index就是按照指定的列分组并作为index,其余列进行聚合操作(其余列应该为剩下的所有列,为什么没有月份一列呢,aggfunc时会讲)。代码、结果如下:
index也可以选择两列,设置多层索引,如下所示
2.2 aggfunc
上例中按照省份分组后,其余列聚合,那么是如何聚合呢,比如北京的土地,是将北京所有的土地求和吗?aggfunc就是负责如何聚合的,是北京所有土地求和,还是求平均值等等。默认是mean,即上例是北京所有土地求平均值。
aggfunc的函数不一定是max,min, sum这种内置函数,也可以是自定义含义或者匿名函数
涉及种类时也可以是
aggfunc=lambda x: x.unique()
上例index中留下一个问题,为什么其余列不包括月份,是因为讲述index时,aggfunc默认为mean,而月份是字符串,不能进行mean操作,故没有月份一列。
2.3 values
index选择需要分组的列作为索引,那么values就是选择对哪些列进行聚合操作。如针对省份进行分组,针对收入进行聚合操作
index和values都可以选择多个
讲述index时,没有设置values,默认是其余可以进行aggfunc操作的所有列
2.4 columns
index是针对每一行的名称进行分组,那么columns就是针对每一列的名称进行分组,选后选择需要进行聚合操作的列作为values进行aggfunc操作。
比如index=‘省份’, columns=‘月份’, values='收入’即index为省份的分组,columns为月份的分组,进行aggfunc操作的为收入的列。如北京1月的收入,北京2月的收入,具体如下:
同样的columns也可以设置多列,即列为多层。
2.5 fill_value&dropna
fill_value为将NaN填充的数值:
dropna=True即删除全部为NaN的列,本例中不涉及,故不再展示
3. pd.read_excel
除了常用的io、sheet_name、header、index_col。其他常用的如(数据依然是上一章的df):
- skiprows:省略指定行的数据
原始数据有四个河北省数据,现在省略第1-4行,故读出来的数据没有河北省的数据
- name:指定列的名称
发现列名不再是省份、月份、收入、土地,而是names指定的。
4. df添加行
4.1 append方法
df添加列很容易,但是行的话需要用append方法
这里的other即新添加的值。
新添加的值可以是list of list、字典、Series、DataFrame。如果是list of list,则默认的index为从0开始。
如果原始的df和other的index不一样,如df列名为A、B、C,新添加Series的index为A、B、D。那么,最终结果就会多一列D。
ignore_index为True即新加一行的index不会和原来df的index相同。如果为False则可能会和原来df的index相同。
特殊的,当Series有name时,ignore_index=False,则新加一行的index为name,为True时,新加一行的index为其他(根据df的index确定)
总而言之,ignore_index很重要,有时ignore_index=False会报错,为True时不会报错
下图为添加dataframe和concat操作有点像
4.2 concat方法
原始数据df是DataFrame,如果添加的是Series,就会出现如下情况
只有将a也变成DataFrame才行
4.3 loc
新添加的一行index也可以自定义:
5. 调整df行列顺序
无论行排序还是列排序,方法都是共用的。
- 方法1:sort_index
如果只是简单按照行名或者列名排序,则使用
df.sort_index(axis=0)或df.sort_index(axis=1)
- 方法2:reindex(极力推荐)
reindex可以实现很多功能,先看下面的截图
可以发现如果新的index和原来index相同,那么就相当于实现了排序功能。无论新的index为何,新得到的数据,只有len(新index)个;新index与原始数据相同的index数据会被复制过来;新index新出现的index,新结果会自动添加(填充何值由method决定);原始数据有某一个index,称作a,但是新index没有,则index a所指的数据就会被删除。
但help以下reindex,会发现reindex的功能不止上述:
可以发现reindex有很多参数,比较重要的有labels、index、columns、axis, method。上述例子只有一个参数,故是指定了labels。下面从排序的角度讲述这5个参数(假设新的索引和原始数据索引相同,等价于排序)
我们知道sort_index可以通过axis来实现对index排序还是对columns排序。其实reindex也一样。
label+axis=0就实现了对index按照自己想要的顺序进行重排的功能。其等效於单独使用index(index不能与axis并用)
label+axis=1就实现了对columns按照自己想要的顺序重排的功能。其等效於单独使用columns(columns不能与axis并用)
method的具体用法详见博客:https://blog.csdn.net/weixin_43178406/article/details/87460939 - 方法3:loc