赞
踩
CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Python:Django实战》、《跟老齐学Python:数据分析》和《Python大学实用教程》畅销图书。
Pandas 系列文章:
另有 NumPy、Matplotlib 系列文章已更新完毕,欢迎关注:
推荐学习资料与网站(博主参与部分文档翻译):
这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/106758103
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!
Pandas 可直接使用 NumPy 的 ufunc(元素级数组方法) 函数:
>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame(np.random.randn(5,4) - 1) >>> obj 0 1 2 3 0 -0.228107 1.377709 -1.096528 -2.051001 1 -2.477144 -0.500013 -0.040695 -0.267452 2 -0.485999 -1.232930 -0.390701 -1.947984 3 -0.839161 -0.702802 -1.756359 -1.873149 4 0.853121 -1.540105 0.621614 -0.583360 >>> >>> np.abs(obj) 0 1 2 3 0 0.228107 1.377709 1.096528 2.051001 1 2.477144 0.500013 0.040695 0.267452 2 0.485999 1.232930 0.390701 1.947984 3 0.839161 0.702802 1.756359 1.873149 4 0.853121 1.540105 0.621614 0.583360
函数映射:在 Pandas 中 apply
方法可以将函数应用到列或行上,可以通过设置 axis 参数来指定行或列,默认 axis = 0,即按列映射:
>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame(np.random.randn(5,4) - 1) >>> obj 0 1 2 3 0 -0.707028 -0.755552 -2.196480 -0.529676 1 -0.772668 0.127485 -2.015699 -0.283654 2 0.248200 -1.940189 -1.068028 -1.751737 3 -0.872904 -0.465371 -1.327951 -2.883160 4 -0.092664 0.258351 -1.010747 -2.313039 >>> >>> obj.apply(lambda x : x.max()) 0 0.248200 1 0.258351 2 -1.010747 3 -0.283654 dtype: float64 >>> >>> obj.apply(lambda x : x.max(), axis=1) 0 -0.529676 1 0.127485 2 0.248200 3 -0.465371 4 0.258351 dtype: float64
另外还可以通过 applymap
将函数映射到每个数据上:
>>> import pandas as pd >>> import numpy as np >>> obj = pd.DataFrame(np.random.randn(5,4) - 1) >>> obj 0 1 2 3 0 -0.772463 -1.597008 -3.196100 -1.948486 1 -1.765108 -1.646421 -0.687175 -0.401782 2 0.275699 -3.115184 -1.429063 -1.075610 3 -0.251734 -0.448399 -3.077677 -0.294674 4 -1.495896 -1.689729 -0.560376 -1.808794 >>> >>> obj.applymap(lambda x : '%.2f' % x) 0 1 2 3 0 -0.77 -1.60 -3.20 -1.95 1 -1.77 -1.65 -0.69 -0.40 2 0.28 -3.12 -1.43 -1.08 3 -0.25 -0.45 -3.08 -0.29 4 -1.50 -1.69 -0.56 -1.81
根据条件对数据集排序(sorting)也是一种重要的内置运算。要对行或列索引进行排序(按字典顺序),可使用 sort_index
方法,它将返回一个已排序的新对象。
在 Series 和 DataFrame 中的基本语法如下:
Series.sort_index(self,
axis=0,
level=None,
ascending=True,
inplace=False,
kind='quicksort',
na_position='last',
sort_remaining=True,
ignore_index: bool = False)
DataFrame.sort_index(self,
axis=0,
level=None,
ascending=True,
inplace=False,
kind='quicksort',
na_position='last',
sort_remaining=True,
ignore_index: bool = False)
官方文档:
常用参数描述如下:
参数 | 描述 |
---|---|
axis | 指定轴排序,0 or ‘index’ ,1 or ‘columns’ ,只有在 DataFrame 中才有 1 or 'columns’ |
ascending | 为 True 时升序排序(默认),为 False 时降序排序 |
kind | 排序方法,quicksort :快速排序(默认);'mergesort’ :归并排序;'heapsort' :堆排序;具体可参见 numpy.sort() |
在 Series 中的应用(按照索引 index 排序):
>>> import pandas as pd
>>> obj = pd.Series(range(4), index=['d', 'a', 'b', 'c'])
>>> obj
d 0
a 1
b 2
c 3
dtype: int64
>>>
>>> obj.sort_index()
a 1
b 2
c 3
d 0
dtype: int64
在 DataFrame 中的应用(可按照索引 index 或列标签 columns 排序):
>>> import pandas as pd >>> obj = pd.DataFrame(np.arange(8).reshape((2, 4)), index=['three', 'one'], columns=['d', 'a', 'b', 'c']) >>> obj d a b c three 0 1 2 3 one 4 5 6 7 >>> >>> obj.sort_index() d a b c one 4 5 6 7 three 0 1 2 3 >>> >>> obj.sort_index(axis=1) a b c d three 1 2 3 0 one 5 6 7 4 >>> >>> obj.sort_index(axis=1, ascending=False) d c b a three 0 3 2 1 one 4 7 6 5
在 Series 和 DataFrame 中的基本语法如下:
Series.sort_values(self,
axis=0,
ascending=True,
inplace=False,
kind='quicksort',
na_position='last',
ignore_index=False)
DataFrame.sort_values(self,
by,
axis=0,
ascending=True,
inplace=False,
kind='quicksort',
na_position='last',
ignore_index=False)
官方文档:
https://pandas.pydata.org/docs/reference/api/pandas.Series.sort_values.html
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html
常用参数描述如下:
参数 | 描述 |
---|---|
by | DataFrame 中的必须参数,指定列的值进行排序,Series 中没有此参数 |
axis | 指定轴排序,0 or ‘index’ ,1 or ‘columns’ ,只有在 DataFrame 中才有 1 or 'columns’ |
ascending | 为 True 时升序排序(默认),为 False 时降序排序 |
kind | 排序方法,quicksort :快速排序(默认);'mergesort’ :归并排序;'heapsort' :堆排序;具体可参见 numpy.sort() |
在 Series 中的应用,按照值排序,如果有缺失值,默认都会被放到 Series 的末尾:
>>> import pandas as pd >>> obj = pd.Series([4, 7, -3, 2]) >>> obj 0 4 1 7 2 -3 3 2 dtype: int64 >>> >>> obj.sort_values() 2 -3 3 2 0 4 1 7 dtype: int64 >>> >>> obj = pd.Series([4, np.nan, 7, np.nan, -3, 2]) >>> obj 0 4.0 1 NaN 2 7.0 3 NaN 4 -3.0 5 2.0 dtype: float64 >>> >>> obj.sort_values() 4 -3.0 5 2.0 0 4.0 2 7.0 1 NaN 3 NaN dtype: float64
在 DataFrame 中的应用,有时候可能希望根据一个或多个列中的值进行排序。将一个或多个列的名字传递给 sort_values()
的 by
参数即可达到该目的,当传递多个列时,首先会对第一列进行排序,若第一列有相同的值,再根据第二列进行排序,依次类推:
>>> import pandas as pd >>> obj = pd.DataFrame({'a': [4, 4, -3, 2], 'b': [0, 1, 0, 1], 'c': [6, 4, 1, 3]}) >>> obj a b c 0 4 0 6 1 4 1 4 2 -3 0 1 3 2 1 3 >>> >>> obj.sort_values(by='c') a b c 2 -3 0 1 3 2 1 3 1 4 1 4 0 4 0 6 >>> >>> obj.sort_values(by='c', ascending=False) a b c 0 4 0 6 1 4 1 4 3 2 1 3 2 -3 0 1 >>> >>> obj.sort_values(by=['a', 'b']) a b c 2 -3 0 1 3 2 1 3 0 4 0 6 1 4 1 4
>>> import pandas as pd
>>> obj = pd.DataFrame({'a': [4, 4, -3, 2], 'b': [0, 1, 0, 1], 'c': [6, 4, 1, 3]}, index=['A', 'B', 'C', 'D'])
>>> obj
a b c
A 4 0 6
B 4 1 4
C -3 0 1
D 2 1 3
>>>
>>> obj.sort_values(by='B', axis=1)
b a c
A 0 4 6
B 1 4 4
C 0 -3 1
D 1 2 3
rank() 函数会返回一个对象,对象的值是原对象经过排序后的索引值,即下标。
在 Series 和 DataFrame 中的基本语法如下:
Series.rank(self: ~ FrameOrSeries,
axis=0,
method: str = 'average',
numeric_only: Union[bool, NoneType] = None,
na_option: str = 'keep',
ascending: bool = True,
pct: bool = False)
DataFrame.rank(self: ~ FrameOrSeries,
axis=0,
method: str = 'average',
numeric_only: Union[bool, NoneType] = None,
na_option: str = 'keep',
ascending: bool = True,
pct: bool = False)
官方文档:
https://pandas.pydata.org/docs/reference/api/pandas.Series.rank.html
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rank.html
常用参数描述如下:
参数 | 描述 |
---|---|
axis | 指定轴排序,0 or ‘index’ ,1 or ‘columns’ ,只有在 DataFrame 中才有 1 or 'columns’ |
method | 有相同值时,如何处理:‘average’ :默认值,去两个相同索引的平均值;‘min’ :取两个相同索引的最小值;‘max’ :取两个相同索引的最大值;‘first’ :按照出现的先后顺序;‘dense’ :和 'min' 差不多,但是各组之间总是+1的,不太好解释,可以看后面的示例 |
ascending | 为 True 时升序排序(默认),为 False 时降序排序 |
在 Series 中的应用,按照值排序,如果有缺失值,默认都会被放到 Series 的末尾:
>>> import pandas as pd >>> obj = pd.Series([7, -5, 7, 4, 2, 0, 4]) >>> obj 0 7 1 -5 2 7 3 4 4 2 5 0 6 4 dtype: int64 >>> >>> obj.rank() 0 6.5 # 第 0 个和第 2 个值从小到大排名分别为 6 和 7,默认取平均值,即 6.5 1 1.0 2 6.5 3 4.5 # 第 3 个和第 6 个值从小到大排名分别为 4 和 5,默认取平均值,即 4.5 4 3.0 5 2.0 6 4.5 dtype: float64 >>> >>> obj.rank(method='first') 0 6.0 # 第 0 个和第 2 个值从小到大排名分别为 6 和 7,按照第一次出现排序,分别为 6 和 7 1 1.0 2 7.0 3 4.0 # 第 3 个和第 6 个值从小到大排名分别为 4 和 5,按照第一次出现排序,分别为 4 和 5 4 3.0 5 2.0 6 5.0 dtype: float64 >>> >>> obj.rank(method='dense') 0 5.0 # 第 0 个和第 2 个值从小到大排名分别为 6 和 7,按照最小值排序,但 dense 规定间隔为 1 所以为 5 1 1.0 2 5.0 3 4.0 # 第 3 个和第 6 个值从小到大排名分别为 4 和 5,按照最小值排序,即 4 4 3.0 5 2.0 6 4.0 dtype: float64 >>> >>> obj.rank(method='min') 0 6.0 # 第 0 个和第 2 个值从小到大排名分别为 6 和 7,按照最小值排序,即 6 1 1.0 2 6.0 3 4.0 # 第 3 个和第 6 个值从小到大排名分别为 4 和 5,按照最小值排序,即 4 4 3.0 5 2.0 6 4.0 dtype: float64
在 DataFrame 中可以使用 axis 参数来指定轴:
>>> import pandas as pd >>> obj = pd.DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1], 'c': [-2, 5, 8, -2.5]}) >>> obj b a c 0 4.3 0 -2.0 1 7.0 1 5.0 2 -3.0 0 8.0 3 2.0 1 -2.5 >>> >>> obj.rank() b a c 0 3.0 1.5 2.0 1 4.0 3.5 3.0 2 1.0 1.5 4.0 3 2.0 3.5 1.0 >>> >>> obj.rank(axis='columns') b a c 0 3.0 2.0 1.0 1 3.0 1.0 2.0 2 1.0 2.0 3.0 3 3.0 2.0 1.0
这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/106758103
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!
以下示例将创建一个 Series 对象, 索引 Index 由两个子 list 组成,第一个子 list 是外层索引,第二个 list 是内层索引:
>>> import pandas as pd >>> import numpy as np >>> obj = pd.Series(np.random.randn(12),index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]]) >>> obj a 0 -0.201536 1 -0.629058 2 0.766716 b 0 -1.255831 1 -0.483727 2 -0.018653 c 0 0.788787 1 1.010097 2 -0.187258 d 0 1.242363 1 -0.822011 2 -0.085682 dtype: float64
官方文档:https://pandas.pydata.org/docs/reference/api/pandas.MultiIndex.html
尝试打印上面示例中 Series 的索引类型,会得到一个 MultiIndex 对象,MultiIndex 对象的 levels 属性表示两个层级中分别有那些标签,codes 属性表示每个位置分别是什么标签,如下所示:
>>> import pandas as pd >>> import numpy as np >>> obj = pd.Series(np.random.randn(12),index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]]) >>> obj a 0 0.035946 1 -0.867215 2 -0.053355 b 0 -0.986616 1 0.026071 2 -0.048394 c 0 0.251274 1 0.217790 2 1.137674 d 0 -1.245178 1 1.234972 2 -0.035624 dtype: float64 >>> >>> type(obj.index) <class 'pandas.core.indexes.multi.MultiIndex'> >>> >>> obj.index MultiIndex([('a', 0), ('a', 1), ('a', 2), ('b', 0), ('b', 1), ('b', 2), ('c', 0), ('c', 1), ('c', 2), ('d', 0), ('d', 1), ('d', 2)], ) >>> obj.index.levels FrozenList([['a', 'b', 'c', 'd'], [0, 1, 2]]) >>> >>> obj.index.codes FrozenList([[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]])
通常可以使用 from_arrays()
方法来将数组对象转换为 MultiIndex 索引对象:
>>> arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
>>> pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
MultiIndex([(1, 'red'),
(1, 'blue'),
(2, 'red'),
(2, 'blue')],
names=['number', 'color'])
其他常用方法见下表(更多方法参见官方文档):
方法 | 描述 |
---|---|
from_arrays(arrays[, sortorder, names]) | 将数组转换为 MultiIndex |
from_tuples(tuples[, sortorder, names]) | 将元组列表转换为 MultiIndex |
from_product(iterables[, sortorder, names]) | 将多个可迭代的笛卡尔积转换成 MultiIndex |
from_frame(df[, sortorder, names]) | 将 DataFrame 对象转换为 MultiIndex |
set_levels(self, levels[, level, inplace, …]) | 为 MultiIndex 设置新的 levels |
set_codes(self, codes[, level, inplace, …]) | 为 MultiIndex 设置新的 codes |
sortlevel(self[, level, ascending, …]) | 根据 level 进行排序 |
droplevel(self[, level]) | 删除指定的 level |
swaplevel(self[, i, j]) | 交换 level i 与 level i,即交换外层索引与内层索引 |
对于这种有多层索引的对象,如果只传入一个参数,则会对外层索引进行提取,其中包含对应所有的内层索引,如果传入两个参数,则第一个参数表示外层索引,第二个参数表示内层索引,示例如下:
>>> import pandas as pd >>> import numpy as np >>> obj = pd.Series(np.random.randn(12),index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]]) >>> obj a 0 0.550202 1 0.328784 2 1.422690 b 0 -1.333477 1 -0.933809 2 -0.326541 c 0 0.663686 1 0.943393 2 0.273106 d 0 1.354037 1 -2.312847 2 -2.343777 dtype: float64 >>> >>> obj['b'] 0 -1.333477 1 -0.933809 2 -0.326541 dtype: float64 >>> >>> obj['b', 1] -0.9338094811708413 >>> >>> obj[:, 2] a 1.422690 b -0.326541 c 0.273106 d -2.343777 dtype: float64
MultiIndex 对象的 swaplevel()
方法可以交换外层与内层索引,sortlevel()
方法会先对外层索引进行排序,再对内层索引进行排序,默认是升序,如果设置 ascending
参数为 False 则会降序排列,示例如下:
>>> import pandas as pd >>> import numpy as np >>> obj = pd.Series(np.random.randn(12),index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]]) >>> obj a 0 -0.110215 1 0.193075 2 -1.101706 b 0 -1.325743 1 0.528418 2 -0.127081 c 0 -0.733822 1 1.665262 2 0.127073 d 0 1.262022 1 -1.170518 2 0.966334 dtype: float64 >>> >>> obj.swaplevel() 0 a -0.110215 1 a 0.193075 2 a -1.101706 0 b -1.325743 1 b 0.528418 2 b -0.127081 0 c -0.733822 1 c 1.665262 2 c 0.127073 0 d 1.262022 1 d -1.170518 2 d 0.966334 dtype: float64 >>> >>> obj.swaplevel().index.sortlevel() (MultiIndex([(0, 'a'), (0, 'b'), (0, 'c'), (0, 'd'), (1, 'a'), (1, 'b'), (1, 'c'), (1, 'd'), (2, 'a'), (2, 'b'), (2, 'c'), (2, 'd')], ), array([ 0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11], dtype=int32))
这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/106758103
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。