Python学习笔记(十八)——Pandas进阶

news2025/1/18 9:03:18
文章主要内容
文件操作:
文件读取 : read_csv(csv),read_table( 表格 ),read_excl(excel)
文件写入: to_csv, to_excel
数据清洗:
处理缺失值: isnull( 识别 ), dropna ( 过滤 ), fillna( 填充 )
数据转换: drop_duplicates ( 去重 ), raplace( 替换 ), cut( 离散化 ), sample( 抽样 ), get_dummies ( 哑变量 )
矢量化字符串函数 : str.fun( 正则方法 ) str. contains( 含有 )
数据规整:
层次化索引: swaplevel( 层次重排 ), sum(level=‘color’, axis=1)( 层次汇总 )
合并数据集: merge( 键连接 ) concat( 轴链接 ) combine_first( 合并重叠数据 )
重塑和轴转向: unstack( 行旋转为列 ) stack( 列旋转为行 )
数据分组与聚合:
数据分组 :groupby( 分组 )
数组聚合 :agg( 聚合 )

Pandas文件操作

Pandas提供了一些用于将表格型数据读取为DataFrame对象的函数

 

文件类型
方法
csv
pd.read_csv(’./data./table.csv’,dtype={ },encoding='utf-8 ',nrows=)
csv
pd.read_table(’.data./table.csv’,sep=",")
xls/xlsx
pd.read_excel(’.data./table.xlsx’)
txt
pd.read_table(’.data./table.txt’)
索引:将一个或多个列当做返回的 DataFrame 处理,以及是否从文件、用户获取列名。
类型推断和数据转换:包括用户定义值的转换、和自定义的缺失值标记列表等
日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
迭代:支持对大文件进行逐块迭代。
不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗
号隔开的数值数据)。

pd.read.csv方法

pd.read_csv(file,sep=‘,’, delimiter=None ,header=‘infer’, names=None,
skiprows=None, nrows=None, encoding=None,index_col=None, usecols=None)

 

pd.read.excel方法

pd.read_excel(io,sheet_name = 0,header=0,names = None,index_col = None,
usecols=None,squeeze = False,dtype = None)
io :字符串,文件的路径对象。
sheet_name None string int ,表示表内数据的分表位置,默认为 0
header: 指定行数用来作为列名,数据开始行数;
names 指定列名,如果文件中不包含 header 的行,应该显性表示 header=None
index_col : 用作行索引的列编号或者列名。
squeeze boolean ,默认为 False, 如果解析的数据只包含一列,则返回一个 Series
skiprows :省略指定行数的数据 , 从第一行开始。
skipfooter :省略指定行数的数据,从尾部数的行开始。

pd.to_csv()方法

pd.to_csv(path, sep=',', na_rep='', float_format=None, columns=None,
header=True, index=True, index_label=None, mode=‘w’, encoding=None)
path :字符串或文件目录,文件路径或对象
sep: 指定分隔符。如果不指定参数,则会尝试使用逗号分隔;
na_rep: 缺失数据填充
header: 指定行数用来作为列名,数据开始行数;
columns: sequence 类型, 指定要写入的字段
index: 是否写行名 ( 索引 ) ,默认为 Ture 指定是否写入行索引
encoding: 指定字符编码格式,例如 utf-8-sig
index_label : 用作行索引的列编号或者列名。
mode=‘w’ 写入模式,默认为 w

pd.to_excel()方法

pd.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', columns=None, header=True,
index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True,
encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)
excel_writer :文件路径或现有的 ExcelWriter
sheet_name :它是指包含 DataFrame 的工作表的名称。
na_repr :缺少数据表示形式。
columns :指要写入的列。
header :写出列名。如果给出了字符串列表 , 则假定它是列名的别名。
index :写入索引。
index_label :引用索引列的列标签。如果未指定 , 并且标头和索引为 True, 则使用 索引名称。
如果 DataFrame 使用 MultiIndex, 则应给出一个序列。
encoding :这是一个可选参数 , 可对生成的 excel 文件进行编码。仅对于 xlwt 是必需的。

 

数据清洗 

数据清洗和准备

在数据分析和建模的过程中,相当多的时间要用在数据准备上:加载、清理、转 换以及重塑。这些工作会占到分析师时间的 80% 或更多。
pandas 和内置的 Python 标准库提供了一组高级的、灵活的、快速的工具,可 以让你轻松地将数据规变为想要的格式。

1)处理缺失数据
2)数据转换
3)字符串处理

缺失数据处理

缺失数据 ( missing data) 在大部分数据分析应用中都很常见。 pandas 的设计目 标之一就是让缺失数据的处理任务尽量轻松。
缺失数据在 pandas 中呈现的方式有些不完美,但对于大多数用户可以保证功能 正常。对于数值数据, pandas 使用浮点值 NaN Not a Number )表示缺失数 据。 我们称其为哨兵值,可以方便的检测出来 .

主要函数及功能

识别缺失数据: df.isnull df.notnull
处理缺失数据:直接删除 df.dropa 、缺失值填充 df.fillna

Numpy处理缺失值

Python 中缺失值对象的类型有 None np.nan(NaN)
None
np.nan
None是Python自带的,其类
型为 python object。None
不能参与到任何计算中。
np.nan是浮点类型,能参与
到计算中,但计算的结果总
是NaN
>>> type(None)
<class 'NoneType'>


>>> type(np.nan)
<class 'float'>

>>> np.nan+10
NaN

Pandas处理缺失值

pandas None np.nan 都视作 np.nan
pandas 中, None np.nan 统一处理成 NaN ,类型为 float 型,可用于计算且运算结果扔为
NaN
pandas 处理空值操作
isnull() 如果为 NaN 就返回 True ,否则返回 False
notnull() 如果为 NaN 就返回 False ,否则返回 True
dropna(): 过滤丢失数据 (NaN)
fillna(): 填充丢失数据 (NaN)
实例
df=pd.DataFrame(np.random.randint(1,100,size=(4,6)),index=['A','B','C','D'],
columns=['a','b','c','d','e','f'])
df.loc['A','c']=np.nan
df.loc['C','c']=None
df.loc['B','d']=None

>>> df.isnull()

 

 

>>> df.notnull()

 

.notnull().any()/all()

.notnull(). any(axis=0) : 判定列或行中存 在是否存在缺失值,只要不存在则为 True;

 

 

 .notnull().all(axis=0) 只要有一个False,结果就为False

直接删除缺失数据

过滤掉缺失数据的办法有很多种,可以通过 pandas.isnull 或布尔索引的手工方 法, 但 dropna 可能会更实用一些。
df.dropna( axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
axis=0 1 ,指定删除含有缺失值的列或行;
how=‘all’ 或‘ any’ ,‘ all’ 表示删除全是缺失值的行(列), any’ 时表示删除只要含有缺失值的行
(列);
thresh=n :保留下来的每一行,其非 NA 的数目 >=n 。;
subset: array-like ,指定从哪些行或列中删除。

 

 缺失数据处理实例

df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],"toy": [np.nan, 'Batmobile', 'Bullwhip’],
"born": [pd.NaT, pd.Timestamp("1940-04-25"), pd.NaT]})

 

 

缺失值补充

df.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
value :用于填充的空值的值;
method {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None 。定义了填充空值的方法, pad / ffill
表示用前面行 / 列的值,填充当前行 / 列的空值, backfill / bfill 表示用后面行 / 列的值,填充当前行 /
列的空值;
axis :轴。 0 或‘ index’ ,表示按行删除; 1 或‘ columns’ ,表示按列删除;
inplace :是否原地替换。布尔值,默认为 False
limit int defaultNone 。如果 method 被指定,对于连续的空值,这段连续区域,最多填充前
limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果 method 未被指定,
在该 axis 下,最多填充前 limit 个空值(不论空值连 续区间是否间断)

缺失数据处理实例

df = pd.DataFrame([[np.nan, 2, np.nan, 0], [3, 4, np.nan, 1], [np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]], columns=list('ABCD'))

 

数据清洗和准备

在数据分析和建模的过程中,相当多的时间要用在数据准备上:加载、清理、转
换以及重塑。这些工作会占到分析师时间的 80% 或更多。
Pandas 和内置的 Python 标准库提供了一 组高级的、灵活的、快速的工具,可
以让你 轻松地将数据规变为想要的格式。
1 )处理缺失数据
2 )数据转换
3 )字符串处理

 数据转换:移除重复数据

DataFrame中经常会出现重复行,利用 duplicated() 函数返回每一行判断是否重 复的结果(重复则为 True ), drop_duplicates则可去除重复行。
pd.drop_duplicates(subset=None, keep='first', inplace=False…)
subset : 列名,可选,默认为 None
keep {‘first’, ‘last’, False}, 默认值 ‘ first’
first : 保留第一次出现的重复行,删除后面的重复行。
last : 删除重复项,除了最后一次出现。
False : 删除所有重复项。
inplace :布尔值,默认为 False ,是否直接在原数据上删除重复项或删除重复项后 返回副本。
inplace=True 表示直接在原来的 DataFrame 上删除重复项,而默认值 False 表示生成一个副
本。)

 数据转换:移除重复数据实例

df=pd.DataFrame({'A':[1,1,1,2,2,3],'B':list("aabbbc")})

>>> df
A B
1 1 a
2 1 a
3 1 b
4 2 b
5 2 b
6 3 c

数据转化:值替换

df.replace() 既可以替换某列,也可以替换某行,还可以全表替换 .

df.replace(to_replace=None, value=None, inplace=False)

 

df = pd.DataFrame({'A': [0, 1, 2, 3, 4], 'B': [5, 6, 7, 8, 9],'C': ['a', 'b', 'c', 'd', 'e']})

数据转化:离散化

通常对于我们不想要连续的数值,我们可将其离散化,离散化也可称为分组、区 间化。 Pandas 提供了方便的函数 cut():

 pd.cut(x, bins, right=True, labels=None, retbins=False,precision=3, include_lowest=False)

x:需要离散化的数组、 Series DataFrame 对象
bins :分组的依据 (int, sequence of scalars, or pandas.)
right :传入 False 则指定左边为闭端
labels :区间的名字 (array or bool)

数据转化离散化实例1

实例二

数据转化:检测和过滤异常数值

 过滤或变换异常值(outlier)在很大程度上就是运用数组运算。

data = pd.DataFrame(np.random.randn(1000, 4))
data[(np.abs(data) > 3).any(1)]

 

data[np.abs(data) > 3] = np.sign(data) * 3
data.head()

 

随机采样

有时候我们只需要数据集中的一部分,并不需要全部的数据。此时需要对数据集 进行随机的抽样, pandas 中自带有抽样的方法。
pd.sample(n=None, frac=None, replace=False, weights=None, axis=None)
n int 类型 , 从轴返回的项目数。 不能与 frac 一起使用;
Frac float 类型,抽取的比列 ( 例如 frac=0.8 ,就是抽取其中 80%)
replace :是否为有放回抽样,取 replace=True 时为有放回抽样;
weights :每个样本的抽样的权重;
axis 是选择抽取数据的行还是列。 axis=0 的时是抽取行, axis=1 时是抽取列

 

计算指标/哑变量

将分类变量( categorical variable )转换为(哑变量矩阵, dummy matrix )或 (指标矩阵, indicator matrix )是常用于统计学习建模或机器学习的转换方式。
DataFrame 的某一列中含有 k 个不同的值,则可以派生出一个 k 列矩阵或 DataFrame (其值为 1 0 )。 pandas 中的 get_dummies 函数可以实现以上功能。

df =pd.DataFrame({'key':['b','a','b','c','a','b'],'data1':range(6)})

Pandas的矢量化字符串函数

在使用 pandas DataFrame 数据框的过程中,如果需要处理一些字符串的特 性, 例如判断某列是否包含一些关键字或求某列的字符长度时,通过 Series str 属性可 以访问方法进行处理会很方便。

Pandas的矢量化字符串函数:实例

data = {'Dave': 'dave@google.com', 'Steve': 'steve@gmail.com','Rob': 'rob@gmail.com', 
'Wes': np.nan}
data=pd.Series(data)

 

 

 

数据规整化

数据分析和建模方面的大量编程工作都是用在数据准备上的 : 加载、清理、转换 以
及重塑。有时候 , 存放在文件或数据库中的数据并不能满足你的数据处理应用的 要
求。
pandas Python 标准库提供了一组高级的、灵活的、高效的核心函数和算法 ,
们使你能够轻松地将数据规整化为正确的形式。
层次化索引
合并数据集
重塑和轴转向

层次化索引

层次化索引 (hierarchical indexing) pandas 的一个重要的功能,它可以在一个轴 上有多个(两个以上)的索引,即以低维度形式来表示高维度的数据。
层次化索引隐式创建
指定多层 Columns 索引

 

层次化索引的显式创建

 

 

层次化索引:set_index方法将普通列转成多层级索引

使用 set_index() 将普通列转化为 index ,再将新数据转置, columns 为多层索引
>>> df = pd.DataFrame({'first':['a','a','b','b','c'], 'two':['1','2','3','1','3'],
'values':[1,2,3,4,5], 'values1':[11,22,33,44,55]})

>>> df
first two values values1
 0     a 1  1     11
 1     a 2  2     22
 2     b 3  3     33
 3     b 1  4     44
 4     c 3  5     55

 

 

>>> df.set_index(['first','two'])
values values1
first two
a 1  1   11
  2  2   22
b 3  3   33
  1  4   44
c 3  5   55

 

层次化索引

                                                                                                                双层列表

data=pd.Series(np.random.randint(2,5,(10,)),index=[['大数据','大数据','大数据','物联网
','物联网','物联网','网络工程','网络工程','计算机','计算机'],[1,2,3,1,2,3,1,2,1,2]])

层次化索引:多层级的Series的取值

data=pd.Series(range(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]])

 

层次化索引:多层级DataFrame的取值

df = pd.DataFrame(np.random.randint(50, 100,size=(4,4)),columns =pd. MultiIndex.from_product([[ "math" ," 
physics" ], [ "term1" , "term2"]]),index = pd. MultiIndex. from_tuples([ ( "class1", "LiLei") , ("class1", 
"HanMeiMei" ),( "class2" , "LiLei") , ("class2" , "RuHua")]))

 

层次化索引:重塑层次化索引

层次化索引为 Dataframe 的数据重排提供了良好的一致性的方式。功能有二:

层次化索引:重塑层次化索引实例

data = pd.DataFrame(np.arange(6).reshape((2, 3)),index=pd.Index(['Oh', 'Co'],
name='state'),columns=pd.Index(['one', 'two', 'three'], name='number'))
>>> data
number one two three
state
Oh 0 1 2
Co 3 4 5
>>> data.stack()
state number
Oh one 0
two 1
three 2
Co one 3
two 4
three 5
dtype: int32
>>> data.stack().unstack()
number one two three
state
Oh 0 1 2
Co 3 4 5

层次化索引:两轴的层次化索引

对于一个 DataFrame ,每条轴都可以有分层索引
>>> frame = pd.DataFrame(np.arange(12).reshape((4, 3)), index=[['a', 'a','b', 'b'], [1, 2, 1, 2]], columns=[['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red','Green']])
>>> frame
Ohio Colorado
Green Red Green
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11

层次化索引的命名

各层都可以有名字(可以是字符串,也可以是别的 Python 对象)。如果指定了名 称,它们就会显示在控制台输出中。

frame = pd.DataFrame(np.arange(12).reshape((4, 3)),index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]], 
columns=[['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']])

 

>>> frame.index.names = ['key1', 'key2’]
>>> frame.columns.names = ['state', 'color']
state Ohio Colorado
color Green Red Green
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11


Ohio Colorado
Green Red Green
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11

>>>frame['Ohio']
color Green Red
key1 key2
a 1 0 1
2 3 4
b 1 6 7
2 9 10

层次化索引:根据级别汇总统计

许多对 DataFrame Series 的描述和汇总统计都有一个 level 选项,它用于指定 在某条轴上求和的级别。

 

合并数据集

pandas 对象中的数据可以通过一些方式进行合并:
pandas.merge 可根据一个或多个键将不同 DataFrame 中的行连接起来。 SQL 或其他关系型数
据库的用户对此应该会比较熟悉,因为它实现的就是数据库 的 join 操作。
pandas.concat 可以沿着一条轴将多个对象堆叠到一起。
实例方法 combine_first 可以将重复数据编接在一起,用一个对象中的值填充
另一个对象中的缺失值。
合并数据集Pandas拼接

 

pd.merge()通过键拼接列

合并数据集:pd.merge()实例1

>>> left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
>>> right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
>>> result = pd.merge(left, right, on='key')

pd.merge()实例二

合并数据集:pd.concat()方法

沿着一条轴,将多个对象堆叠到一起
pd.concat(objs, axis=0, join=‘outer,ignore_index=False, keys=None, levels=None)

 

objs :需要连接的对象集合, Series | DataFrame objects
axis :连接轴向,默认 0 轴连接;
join :参数为‘ outer’ 或‘ inner’,
join_axes=[] :指定自定义的索引;
keys=[] :创建层次化索引;
ignore_index=False boolean, 默认 False

合并数据集:DataFrame.append()方法

append concat 的简略形式 , 只不过只能在 axis=0 上进行合并
DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=None)

 

其他: DataFrame 或类似 Series / dict 的对象 , 或这些对象的列表
它是指要附加的数据。
ignore_index :如果为 true, 则不使用索引标签。
verify_integrity :如果为 true, 则在创建具有重复项的索引时会引
ValueError
sort :如果 self other 的列不对齐 , 则对列进行排序。默认排序 已弃用 , 在将来的 Pandas 版本中
它将更改为不排序。我们通过 sort = True 明确地使警告和排序保持沉默 , 而我们通过 sort =
False 明确地使警告而不是排序保持沉默。
合并数据集:pd.join()方法
DataFrame.join(other, on=None, how='left', lsuffix=' ', rsuffix=' ', sort=False)
参数的意义与 merge 方法基本相同,只是 join 方法默认为左外连接 how=’left’
应用场景:无重复列名的两个表 df1 df2 基于行索引进行列拼接,直接使用 df1.join(df2) 即可 ,
需添加任何参数,合并表的行数与 left 表相同,列数为 left +right 表的列数之和,结果仅保留 left
表和 right 表中行索引相同的行,对列不做任 何处理。如果两个表有重复的列名,需指定 lsuffix,
rsuffix 参数。

concat和 append 可以实现的是表间”拼接“,而 merge join 则实现的是表间”合并“。区别
在于 是否基于”键“来进行合并。如果只是简单地”堆砌“,则用 concat append 比较合适,
而如果 遇到关联表,需要根据”键“来合并,则用 merge join
concat merge pandas 的属性,所以调用的时候应该写成 pd.concat() 或者 pd.merge() ;而
append join 是对 DataFrame 的方法,所以调用的时候应该写成 df.append() 或者 df.join()
append 只能实现行拼接,从这个观点来看, concat 的功能更加强大。理论上 append 可以完成
的操作 concat 都可以完成,只需要更改相应的参数即可。
类似于 append 之于 concat join 可以完成的操作 merge 也都可以完成,因此 merge 更加强大。
append join 存在的意义在于简洁和易用。
最关键地, concat 后面对于 df 的参数形式是 objs ,这个 objs 可以是一个列表或者集合,里面可
以有 很多个 df ;而 merge 后面跟的参数形式是 left right ,只有两个 df 。因此 concat 其实可以快
速实现多 表的拼接,而 merge 只能实现两表的合并

 

数据聚合与分组运算

透视表

什么是透视表?
透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都 在 Excel
使用过数据透视表,也体会到它的强大功能,而在 pandas 中它被称作 pivot_table
为什么要使用 pivot_table
灵活性高,可以随意定制你的分析计算要求
脉络清晰易于理解数据
操作性强,报表神器

对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数 据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计 算分 组统计或生成透视表。 pandas 提供了一个灵活高效的 gruopby 功能,它 使你能以一种 自然的方式对数据集进行切片、切块、摘 要等操作。
利用键分割 pandas 对象 (groupby)
计算分组的概述统计
应用组内转换或其他运算
计算透视表或交叉表
执行分位数分析以及统计分组分析

groupby()函数机制

有些场景需要对数据内部进行分组 处理,如给定一组全校学生成绩的 数据,我 们想通过班级进行分组或 者再对班级分组后的性别进行分组 来进行分析,这时 通过 pandas 下的
groupby() 函数就可以解决。 groupby() 函数将会是一个 数据分析辅助的利器。

groupby()函数机制

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, dropna=True, group_keys=True, observed=False)
by : 接收映射、函数、标签或标签列表;用于确定聚合的组。
表示 DataFrame 某个列名的值
列表或数组,其长度与待分组的轴一样。
字典或 Series ,给出待分组轴上的值与分组名之间的对应关系。
函数,用于处理轴索引或索引中的各个标签。
axis : 接收 0/1 ;用于表示沿行 (0) 或列 (1) 分割。
level : 接收 int 、级别名称或序列;如果轴是一个多索引 ( 层次化 ) ,则按一个或多个特定级别分组。
as_index :接收布尔值,默认 Ture Ture 则返回以组标签为索引的对象, False 则不以组标签为
索引

groupby函数机制:分组情况

df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'], 'key2' : ['one', 'two', 'one', 'two', 'one'], 
'data1' : np.random.randn(5), 'data2' : np.random.randn(5)})

>>>g=df.groupby("key1")
<pandas.core.groupby.generic.DataFrameGroupB
y object at 0x0000023241D04B48

 

分组对象属性和方法
>>>g.groups #分组索引
{'a': Int64Index([0, 1, 4], dtype='int64'),
'b': Int64Index([2, 3], dtype='int64')}
>>> g.size()
key1
a 3
b 2
dtype: int64

>>>g.get_group('a')
# 获取某个分组成员
key1 key2 data1 data2
a one 0.678844 0.722869
a two 1.236807 -0.997396
a one 1.373321 -1.392988

 groupby()函数机制:对分组进行迭代

GroupBy 对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'], 'key2' : ['one', 'two', 'one', 'two', 'one’], 'data1' : np.random.randn(5), 'data2' : np.random.randn(5)})

分组统计

DataFrameGroupBy 对象只是一个中间结果,有很多函数和方法可以调用,如 max() count() std() 等,返回的结果是一个 DataFrame 对象。

 

选取一列或列的子集

对于由 DataFrame 产生的 GroupBy 对象,如果用一个(单个字符串)或一组(字符 串数组)列名对其进行索引,就能实现选取部分列进行聚合的目的。尤其对于大数据 集,很可能只需要对部分列进行聚合。

 

分组:通过字典或Series进行分组

>>> people = pd.DataFrame(np.arange(25).reshape((5, 5)), columns=['a', 'b', 'c',
'd', 'e'], index=['Joe', "Steve", 'Wes', 'Jim', 'Travis'])
>>> people.iloc[2:3, [1, 2]] = np.nan #Add a few NA values
>>> mapping = {'a': 'red', 'b': 'red', 'c': 'blue','d': 'blue', 'e': 'red', 'f' : 'orange'}

a b c d e
Joe 0 1.0 2.0 3 4
Steve 5 6.0 7.0 8 9
Wes 10 NaN NaN 13 14
Jim 15 16.0 17.0 18 19
Travis 20 21.0 22.0 23 24

>>> people.groupby(mapping, axis=1).sum()
blue red
Joe 5.0 5.0
Steve 15.0 20.0
Wes 13.0 24.0
Jim 35.0 50.0
Travis 45.0 65.0

 分组:通过函数进行分组

使用 Python 函数是一种更原生的方法定义分组映射。任何被当做分组键的函数都会 在各个索引值上被调用一次,其返回值就会被用作分组名称。

 

分组:通过索引级别进行分组

层次化索引数据集最方便的地方就在于它能够根据轴索引的一个级别进行聚合
>>> columns = pd.MultiIndex.from_arrays([['US', 'US', 'US', 'JP', 'JP'], [1, 3, 5,
1, 3]], =['cty', 'tenor'])
>>> hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns)

数据聚合

聚合指的是任何能够从数组产生标量值的数据转换过程。之前的例子已经用过一些, 比如 mean count min 以及 sum 等。

 

 数据聚合:agg函数

 

面向列的多函数应用1

假设对一个列或不同的列应用不同的函数。具体的办法是向 agg 传入一个从列名映射 到函数的字典:

面向列的多函数应用2

如果传入一组函数或函数名,得到的DataFrame的列就会以相应的函数命名 

 apply:一般性的“拆分-应用-合并”

最通用的 GroupBy 方法是 apply apply 会将待处理的对象拆分成多个片段,然后对 各片段调用传入的函数,最后尝试将各片段组合到一起

 例子

 禁止分组键

分组键会跟原始对象的索引共同构成结果对象中的层次化索引。将 group_keys= False 传入 groupby

 传送门:Python全套学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MVCC多版本并发控制

目录 1、数据库并发场景 2、当前读和快照读 3、MVCC的隔离级别 4、实现原理 4.1、隐藏字段 ​​​​​​​4.2、Undo_log&#xff08;版本链&#xff09; 4.3、Read View&#xff08;读视图&#xff09; 4.4、RC、RR隔离级别下的快照读有什么区别 MVCC&#xff0c;多版…

文献认证!Kamiya艾美捷抗酒石酸酸性磷酸酶TRAP染色试剂盒

人类及动物体骨组织不断地进行着重建&#xff0c;骨重建过程包括骨的分解吸收与新骨的形成。破骨细胞&#xff08;Osteoclast&#xff0c;OC&#xff09;负责骨分解与吸收&#xff0c;而成骨细胞&#xff08;osteoblast&#xff0c;OB&#xff09;负责新骨形成。破骨细胞贴附在…

【WAX链游】发布一个免费开源的MiningNetwork合约脚本BTK

前言 挖矿网络&#xff08;Mining Network&#xff09;官网&#xff1a; https://miningnetwork.io 挖矿网络&#xff08;Mining Network&#xff09;合约脚本&#xff1a;https://github.com/encoderlee/MiningNetworkBot 回顾之前我们推出过的免费开源链游脚本&#xff1a…

【React技术】JSX在企业级项目的运用and一个元素渲染demo

JSX 它被称为JSX,是JavaScript的语法扩展。我们建议在React中使用JSX。JSX可以很好地描述UI应该呈现它应该具有的基本交互形式。JSX可能会让人想起模板语言,但它具有JavaScript的所有功能。 const element = <h1>Hello, world!</h1>;React认为渲染逻辑与其他UI…

红眼睛红外成像微型成像仪快速刷新与动态显示温度测量

默认参数下&#xff0c;设备的温度测量和数据输出频率为每秒 4Hz&#xff0c;这一输出速率基本可以保证所有计 算机和手机都能够正常显示实时画面&#xff0c;但导致的问题是实时画面有卡顿的感觉。数据的处理速度与 计算机和手机的配置高低有直接关系&#xff0c;下面仅以…

VScode 基础使用教程

VScode 的安装以及使用基础&#xff08;C配置&#xff09; 奉上VScode安装物资 VScode 的安装 进入VScode官网&#xff0c;点击 Download for windows 即可得到安装包&#xff0c;运行即可。 编译器G的配置 下载 MinGW&#xff0c;将其保存至任意磁盘中&#xff08;下面默认C…

在 Navicat 中执行数据库范围搜索

无论你选择的数据库是 MySQL、MariaDB、SQL Server、Oracle 和 PostgreSQL&#xff0c;还是基于云的服务&#xff0c;如 Amazon RDS、Amazon Aurora、Amazon Redshift、SQL Azure、Oracle Cloud 和 Google Cloud&#xff0c;你都将不可避免地要寻找一些你不知道位置的数据。在这…

简单3步轻松搭建个人博客

对于计算机专业的学生&#xff0c;课余时间最有价值的事莫过于写技术博客了。我们可以通过博客记录生活经历、学习过程、技术成长&#xff0c;同时博客还能树立个人品牌&#xff0c;结识更多兴趣相投的人。 从计算机技术角度而言&#xff0c;博客的搭建及维护会让你的技术不断…

猴子也能学会的jQuery——总结习题

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

字符串压缩(三)之短字符串压缩

一、通用算法的短字符压缩 开门见山&#xff0c;我们使用一段比较短的文本&#xff1a;Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, its stopped raining. 使用ZSTD与LZ4分别压缩一下上面这段短文本。下面分别是它们的压缩结果。…

良好基本面引领发展,中国春来将聚势而强?

2022年&#xff0c;是一个挑战与机遇共存的年份。 一方面&#xff0c;作为“双减”、《民促法实施条例》落地执行的第一年&#xff0c;转型难题困扰着广大K12教培企业。另一方面&#xff0c;职业教育、教育信息化利好政策频出&#xff0c;不少从业者藉此打开局面、柳暗花明。 …

[附源码]Python计算机毕业设计Djangospringboot作业管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

项目经理和产品经理正在用哪些管理工具?

项目管理包括定义项目目标&#xff0c;指定行程和安排任务&#xff0c;以达到特定的目标。在项目管理过程中&#xff0c;很多工具可以使项目管理更有效、更高效。&#xff08;项目管理资料文末&#xff09; 跟大家介绍一下项目经理常用的项目管理工具&#xff1a; 1、甘特图 …

[附源码]计算机毕业设计springboot动物保护协会网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Seata中的AT事务模式是如何实现行锁

Seata中的AT事务模式里面的全局锁是行锁,这也是AT事务模式和XA事务模式在锁粒度上的最大区别。我们可以在官网中可以看到这样一个例子: 两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行更新操作,m 的初始值 1000。tx1先开始,开启本地事务,拿到本地锁,更新操作 m = 10…

2022安洵杯web题复现

前言 个人觉得赛题质量蛮好的&#xff0c;只是自己太菜了&#xff0c;花了很长时间都在琢磨第一道web&#xff0c;因为一些细节上的问题导致一直解不出来。赛后就找师傅的wp重新去复现一下&#xff0c;总结自己的问题&#xff0c;在此记录一下&#xff0c;以便日后复习。 bad…

[附源码]计算机毕业设计springboot财务管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

WebView2 通过 PuppeteerSharp 实现爬取 王者 壁纸 (案例版)

王者壁纸自动化获取逻辑分析 其实它的逻辑很简单&#xff0c; 就是王者的官网&#xff0c;打开后&#xff0c;在右下角就看到了皮肤页面部分。 这个时候&#xff0c;点击更多&#xff0c;就会打开全部英雄详情的页面。 这个时候&#xff0c;单点任意一个英雄&#xff0c;就会…

怎么从零开始搭建配置Windows云服务器的新手入门教程

本文是搭建 Windows 云服务器入门教程&#xff0c;主要介绍如何从零开始&#xff0c;以最简单的方式搭建和配置你的Windows 云服务器。如果您之前没有搭建云服务器的经验&#xff0c;建议您按照本文介绍的方式来购买和配置您的第一台云服务器。 1、步骤1&#xff1a;注册腾讯云…

文件上传漏洞笔记

漏洞成因 文件上传漏洞正是在文件上传功能中&#xff0c;由于对用户上传的文件数据未做有效检测或过滤不严&#xff0c;导致上传的恶意文件被服务端解释器解析执行&#xff0c;利用漏洞可获取系统控制权。 很多网站都有一些文件上传功能&#xff0c;常见的是图片、视频、压缩文…