暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

利用Python进行数据分析之pandas

这是我的葱 2021-12-12
361

Numpy能够帮助我们处理数值型数据,但是这还不够,我们的数据除了数值以外,还有字符串还有时间序列等等,所以pandas出现了。pandas是一个强大的分析结构话数据的工具集,基于Numpy构建,提供了高级数据结构和数据操作工具,是使Python成为强大而高效的数据分析环境的重要因素之一

  • 一个强大的分析和操作大型结构化数据集所需的工具集

  • 基础是numpy,提供了高性能矩阵的运算

  • 提供了大量能够快速便捷地处理数据的函数和方法

  • 应用于数据挖掘,数据分析

  • 提供数据清洗功能

详细pandas内容可前往pandas官方网站进行学习。

pandas数据结构

为了入门pandas,需要熟悉两个常用的工具数据结构:Series
DataFrame
。尽管它们并不能解决所有问题,但它们为大多数应用提供了一个有效、易用的基础。

Series

Series是一种一维的数组型对象,包含一个值序列,并且包含了数据标签(index)。

import pandas as pd
import numpy as np
# Series是一种一维的数组型对象,包含一个值序列和索引,索引(index)在左边,值(value)在右边
# 默认的索引是从0开始到N-1(N是数据的长度)

def prints(a):
   print(a)
   print('='*30)
# 创建Series的方法有三种
   # 通过list创建:
obj = pd.Series([4,7,-5,3])
prints(obj)
prints(obj.values)
prints(obj.index# 与 range(4) 类似
prints(obj[1])
obj2 = pd.Series([4,7,-5,3],index=['d','b','a','c'])
prints(obj2.index)
prints(obj2['a'])

   # 通过数组创建
obj3 = pd.Series(np.arange(1,6))
prints(obj3)

   # 通过字典创建
sdata = {'Tom':180,'Jim':175,'Lily':168,'Jerry':185}
obj4 = pd.Series(sdata)
prints(obj4)

Series的基本用法包括

  • isnull notnull 检查缺失值

  • 通过索引获取数据

  • 数据对齐:在数学操作中自动对齐索引

  • Series的name属性

import pandas as pd
import numpy as np
def prints(a):
   print(a)
   print('='*30)
# isnull notnull 检查缺失值
sdata = {'Tom':180,'Jim':175,'Lily':168,'Jerry':185}
obj1 = pd.Series(sdata,index=['Tom','Jim','Lily','Jerry','Toby'])
prints(obj1)
prints(pd.isnull(obj1))
prints(pd.notnull(obj1))
prints(obj1.isnull()) # 实例方法
prints(obj1.notnull())
# 通过索引/切片获取数据
prints(obj1.index)
prints(obj1.values)
prints(obj1['Tom'])
prints(obj1[0])
prints(obj1[['Tom','Lily']]) #选取多个值
prints(obj1[1:3]) # 切片取值
prints(obj1['Tom':'Jerry']) # 标签切片包含末端数据
prints(obj1[obj1>170]) # 布尔索引
# 索引与数据的对应关系不被运算结果影响
prints(obj1 * 2)
# name属性
obj1.name = 'height'
obj1.index.name = 'name'
prints(obj1)
prints(obj1.head(3)) # 打印前3行
prints(obj1.tail(3)) # 打印后3行

DataFrame

DataFrame是表示矩阵的数据表,它包含已排序的列集合,每一列可以是不同的数据类型。DataFrame有行索引也有列索引,数据被存储为一个以上的二维块。后续可以利用分层索引在DataFrame中展现更高维度的数据。

常用的构建DataFrame的方式是利用Numpy数组的字典或包含等长度列表。

  1. 通过字典创建DataFrame

    import pandas as pd
    import numpy as np
    def prints(a):
       print(a)
       print('='*30)
    # 字典类:
       # 数组、列表或元组构成的字典构造dataframe
    data1 = {'a':[1,2,3,4],'b':[5,6,7,8],'c':np.arange(9,13)}
    frame1 = pd.DataFrame(data1)
    prints(frame1)
    prints(frame1.index# 行索引
    prints(frame1.columns# 列索引
    prints(frame1.values# 值
    frame2 = pd.DataFrame(data1,index=['A','B','C','D'],columns=['a','v','c','d'])
    prints(frame2)
       # Series构成的字典构造dataframe
    frame3 = pd.DataFrame({'a':pd.Series(np.arange(3)),'b':pd.Series(np.arange(3,5))})
    prints(frame3)
       # 字典构成的字典构造dataframe
    data2 = {
       'a':{'apple':3.6,'banana':'5.6'},
       'b':{'apple':3.6,'banana':'5.6'},
       'c':{'apple':3.6}
    }
    frame4 = pd.DataFrame(data2)
    prints(frame4)
  2. 通过列表创建DataFrame

    import pandas as pd
    import numpy as np

    def prints(a):
       print(a)
       print('='*30)

    # 列表类
       # 2D ndarray构造dataframe
    arr1 = np.arange(12).reshape(4,3)
    prints(arr1)
    frame1 = pd.DataFrame(arr1,index=['a','b','c','d'],columns=['A','B','C'])
    prints(frame1)
       # 字典构成的列表构造dataframe
    list1 = [{'apple':3.6,'banana':5.6},{'apple':3,'banana':5},{'apple':3.2}]
    frame2 = pd.DataFrame(list1,index=['a','b','c'])
    prints(frame2)
       # Series构成的列表构造dataframe
    list2 = [pd.Series(np.random.rand(3)),pd.Series(np.random.rand(2))]
    frame3 = pd.DataFrame(list2)
    prints(list2)
    prints(frame3)
  1. DataFrame构造函数的有效输入

    类型描述
    2D ndarray数据的矩阵,行和列标签是可选参数
    数组、列表和元组构成的字典每个序列成为DataFrame的一列,所有的序列必须长度相等
    Numpy结构化数组与数组构成的字典一致
    Series构成的字典每个值成为一列,每个Series的索引形成行索引,也可以显式地传递索引
    字典构成的字典每个内部字典成为一列,字典的键形成行索引,
    字典或Series构成的列表列表中的一个元素形成DataFrame的一行,字典键或Series索引形成列标签
    列表或元组构成的列表与2D ndarray一致
    其他DataFrame如果不显示传递索引,则会使用原DataFrame索引
    Numpy MaskedArray与2D ndarray类似,但隐蔽值会在结果DataFrame中成为缺失值

DataFrame的基本使用

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# 转置
frame1 = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['A','B','C'])
prints(frame1)
prints(frame1.T# 行与列转置
# 通过列索引获取数据(Series类型)
prints(frame1['A'])
prints(type(frame1['A']))
# 增加列数据
frame1['D'] = 9
prints(frame1)
frame1['D'] = [1,2,3]
prints(frame1)
# 删除列
del(frame1['D'])
prints(frame1)

索引对象

索引对象是用于存储轴标签和其他元数据的,索引对象不可变,保证了数据的安全。

import pandas as pd
import numpy as np
# Series和DataFrame中的索引都是Index对象
def prints(a):
   print(a)
   print('='*30)

ps = pd.Series(np.arange(1,5),index=('a','b','c','d'))
prints(ps)
prints(ps.index)
prints(type(ps.index))
pd1 = pd.DataFrame(np.arange(9).reshape(3,3),index=('a','b','c'),columns=('A','B','C'))
prints(pd1)
prints(pd1.index)
prints(pd1.columns)

与Python集合不同,pandas索引对象可以包含重复标签,根据重复标签进行筛选,会选取所有重复标签对应的数据。下表总结了一些索引集合逻辑的方法和属性:

方法描述
append将额外的索引对象粘贴到原索引后,产生一个新的索引
difference计算两个索引的差集
intersection计算两个索引的交集
union计算两个索引的并集
isin计算表示每一个值是否在传值容器中的布尔数值
delete将位置i的元素删除,并产生新的索引
drop根据传参删除置顶索引值,并产生新的索引
insert在位置i插入元素,并产生新的索引
is_monotonic如果索引序列递增,则返回True
is_unique如果索引序列唯一,则返回True
unique计算索引的唯一值序列


pandas基本功能

重点了解Series和DataFrame中数据交互的基础机制。

重建索引

reindex方法用于创建一个符合新索引的新对象

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# reindex 创建一个符合新索引的新对象
ps1 = pd.Series(np.arange(1,5),index=('a','b','c','d'))
ps2 = ps1.reindex(['a','b','c','d','e'])
prints(ps1)
prints(ps2)

pd1 = pd.DataFrame(np.arange(9).reshape(3,3),index=('a','b','c'),columns=('A','B','C'))
pd2 = pd1.reindex(['a','b','c','d']) # 重建行索引
prints(pd2)
pd3 = pd1.reindex(columns=['C','B','A']) # 重建列索引
prints(pd3)

reindex方法的参数:

方法描述
index新建作为索引的序列
method插值方式:'ffill'为前向填充,'bfill'为后向填充
fill_value通过重新索引引入缺失数据时使用替代值
limit前向/后向填充时,所需填充的最大尺寸间隙(元素数量)
tolerance前向/后向填充时,所需填充的不精确匹配下的最大尺寸间隙(绝对值距离)
level匹配MultiIndex级别的简单索引
copyTrue时,总是复制底层数据;False时,在索引相同时不复制数据

索引操作

pandas索引操作与Numpy数组索引的功能类似,但pandas的索引值可以不仅仅是整数,简单来说可以分为增删改查四种基本操作。

append函数和insert函数

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

ps1 = pd.Series(np.arange(1,5),index=('a','b','c','d'))
ps1['e'] = 9
prints(ps1)
ps2 = pd.Series({'f':8})
ps3 = ps1.append(ps2# 拼接两个Series
prints(ps3)

pd1 = pd.DataFrame(np.arange(9).reshape(3,3),index=('a','b','c'),columns=('A','B','C'))
# 增加列
pd1[4] = 9
prints(pd1)
pd1[4] = [10,11,12# 在末尾增加列
prints(pd1)
pd1.insert(0,'E',[18,19,20]) # 在指定位置插入列
prints(pd1)

# 增加行
# 标签索引loc
pd1.loc['d'] = [1,1,1,1,1# 末尾添加行
prints(pd1)
row = {4:6,'A':7,'B':8,'C':9,'E':10}
pd2 = pd1.append(row,ignore_indexTrue# 拼接字典
prints(pd2)

del函数和drop函数

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# 通过del函数删除,会改变原来的值
   # Series
ps1 = pd.Series(np.arange(1,7),index=('a','b','c','d','e','f'))
del ps1['b']
prints(ps1)
   # DataFrame
pd1 = pd.DataFrame(np.arange(16).reshape(4,4),index=('a','b','c','d'),columns=('A','B','C','D'))
del pd1['C'# 删除一列
prints(pd1)

# 通过drop函数删除,不会改变原来的值
   # Series 
ps2 = ps1.drop('a'# 删除一条
prints(ps1)
prints(ps2)
ps3 = ps1.drop(['a','d']) # 删除多条
prints(ps3)
   # DataFrame
       # 删除行
pd2 = pd1.drop('a'# 删除一行
prints(pd2)
pd3 = pd1.drop(['a','b']) # 删除多行
prints(pd3)
       # 删除列
pd4 = pd1.drop('A',axis=1# axis = 1 列;axis = 0 行
prints(pd4)
pd5 = pd1.drop('A',axis'columns')
prints(pd5)

# 通过inplace属性,在原对象上删除,不会返回新的对象
ps1.drop('e',inplace=True)
prints(ps1)

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

ps1 = pd.Series(np.arange(1,7),index=('a','b','c','d','e','f'))
pd1 = pd.DataFrame(np.arange(16).reshape(4,4),index=('a','b','c','d'),columns=('A','B','C','D'))
# Series
ps1['a'] = 999 # 通过标签索引进行修改
prints(ps1)
ps1[0] = 888 # 通过位置索引进行修改
prints(ps1)

# DataFrame
   # 修改列
pd1['A'] = 9
prints(pd1)
pd1['A'] = [9,10,11,12]
prints(pd1)

pd1.A = 6 # 对象.列 的方式进行数据修改
prints(pd1)
   # 修改行
   # loc 标签索引
pd1.loc['a'] = 777
prints(pd1)
pd1.loc['a','A'] = 888
prints(pd1)

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

ps1 = pd.Series(np.arange(1,7),index=('a','b','c','d','e','f'))
pd1 = pd.DataFrame(np.arange(16).reshape(4,4),index=('a','b','c','d'),columns=('A','B','C','D'))
# Series
prints(ps1['a']) # 标签索引
prints(ps1[0]) # 位置索引
prints(ps1['a':'e']) # 标签切片索引,包含终止标签索引
prints(ps1[0:5]) # 位置切片索引,不包含终止位置索引
prints(ps1[['a','c','d']]) # 不连续索引,两个中括号
prints(ps1[[0,2,4]]) # 同上
prints(ps1[ps1>2]) # 布尔索引

# DataFrame
   # 列索引
prints(pd1['A'])
prints(pd1[['A','C','D']]) # 不连续索引
prints(pd1['A']['d'])
   # 行索引
prints(pd1[:2]) # 切片索引

高级索引

当对一个包含整数轴索引的DataFrame对象进行索引操作时,标签索引和位置索引的表达方式是很类似的,未避免将来引起歧义,数据选择时建议始终使用标签索引,为更精确地处理,可以使用loc(用于标签)或iloc(用于整数位置)进行索引。

import pandas as pd
import numpy as np


def prints(a):
   print(a)
   print('='*30)


ps1 = pd.Series(np.arange(17), index=('a''b''c''d''e''f'))
pd1 = pd.DataFrame(np.arange(16).reshape(44), index=(
   'a''b''c''d'), columns=('A''B''C''D'))
# loc 标签索引,loc是基于标签名的索引
prints(ps1['a':'c'])
prints(ps1.loc['a':'c'])

prints(pd1.loc['a':'c''A':'C'])  # 第一个参数是索引行,第二个参数是列
# iloc 位置索引
prints(ps1[0:3])
prints(ps1.iloc[0:3])

prints(pd1.iloc[0:31:3])  # 第一个参数是索引行,第二个参数是列
# ix 标签与位置混合索引
# prints(ps1.ix[1:3])
# 在pandas版本0.20.0及其以后版本中,ix已经不被推荐使用,建议采用iloc和loc实现ix。

下表总结了DataFrame不同的索引选项:

类型描述
df[val]从DataFrame中选择单列或列序列
df.loc[val]根据标签选择单行或多行
df.loc[ : , val]根据标签选择单列或多列
df.loc[val1, val2]同时选择行和列的一部分
df.iloc[where]根据整数位置选择单行或多行
df.iloc[ : , where]根据整数位置选择单列或多列
df.iloc[where_i, where_j]根据整数位置选择行和列
df.at[label_i, label_j]根据行、列标签选择单个标量值
df.iat[i, j]根据行、列整数位置选择单个标量值
reindex通过标签选择行或列
get_value, set_value根据行和列的标签设置单个值

算术和数据对齐

不同索引对象之间的算术行为是pandas提供给一些应用的重要特性之一。如果某个索引对不相同,则返回结果的索引将是索引对的并集,类似于索引标签的自动外连接(outer join)

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# pandas的对齐运算是数据清洗的重要过程,可以按索引对齐进行运算
# 如果没有对齐的位置则补NAN,最后也可以填充NAN

# Series按行索引对齐
s1 = pd.Series(range(10,20),index=range(10))
s2 = pd.Series(range(20,25),index=range(0,10,2))
print('s1:')
prints(s1)
print('s2:')
prints(s2)
print('s1 + s2:')
prints(s1+s2)

# DataFrame对齐运算
df1 = pd.DataFrame(np.arange(16).reshape(4,4),index=['a','b','c','d'],columns=['A','B','C','D'])
df2 = pd.DataFrame(np.random.randint(2,20,size=(2,3)),index=['b','d'],columns=list('ABD'))
print('df1:')
prints(df1)
print('df2:')
prints(df2)
print('df1 + df2:')
prints(df1 + df2)

使用填充值的算术运算

在两个不同的索引对象之间进行算术操作时,可能想要使用特殊填充值,可以利用算术方法实现:

import pandas as pd
import numpy as np


def prints(a):
   print(a)
   print('='*30)

# 算术方法表:(字母r开头,代表会反转参数)
# add/radd 加法(+)
# sub/rsub 减法(-)
# div/rdiv 除法(/)
# floordiv/rfloordiv 整除(//)
# mul/rmul 乘法(*)
# pow/rpow 幂次方(**)


# Series
s1 = pd.Series(range(1020), index=range(10))
s2 = pd.Series(range(2025), index=range(0102))
prints(s1.add(s2fill_value=0))

# DataFrame
df1 = pd.DataFrame(np.arange(16).reshape(44), index=[
                  'a''b''c''d'], columns=['A''B''C''D'])
df2 = pd.DataFrame(np.random.randint(220size=(23)),
                  index=['b''d'], columns=list('ABD'))
prints(df1.add(df2fill_value=0))
prints(df2.reindex(columns=df1.columnsfill_value=9))

DataFrame和Series的混合运算

DataFrame和Series之间的算术操作与Numpy中不同维度数组间的操作类似,Series的索引会和DataFrame的列/行进行匹配,并广播到各行/列:

import pandas as pd
import numpy as np


def prints(a):
   print(a)
   print('='*30)


# Series
s1 = pd.Series(range(1020), index=range(10))
s2 = pd.Series(range(2025), index=range(0102))

# DataFrame
df1 = pd.DataFrame(np.arange(16).reshape(44), index=[
                  'a''b''c''d'], columns=['A''B''C''D'])
df2 = pd.DataFrame(np.random.randint(220size=(23)),
                  index=['b''d'], columns=list('ABD'))
s3 = df1.iloc[0]
prints(df1-s3)  # 按照行进行广播
s4 = df1['A']
prints(s4)
prints(df1.sub(s4axis='index'))  # 按照列广播,axis=0能达到同样的效果

函数应用与映射

利用DataFrame中的apply和applymap方法可以将常用的一些函数应用到一行或一列的一维数组上:

import pandas as pd
import numpy as np


def prints(a):
   print(a)
   print('='*30)


# Series
s1 = pd.Series(range(1020), index=range(10))
s2 = pd.Series(range(2025), index=range(0102))

# DataFrame
df = pd.DataFrame(np.random.randn(54), index=[
                 'a''b''c''d''e'], columns=list('ABCD'))
prints(df)
# 方法一 dataframe可以直接使用numpy的函数
prints(np.abs(df))
# 通过apply将函数应用到列或者行
def f(x): return x.max()


prints(np.abs(df).apply(f))  # 默认axis=0,取的是列方向上的最大值
prints(np.abs(df).apply(faxis=1))  # 取行方向上的最大值
# 通过applymap将函数应用到每个数据
def f2(x): return '%.2f' % x  # '%.2f'表示保留两位小数


prints(np.abs(df).applymap(f2))

大部分最常用的数据统计(比如sum
mean
)都是DataFrame的方法,因此计算统计值时使用apply
并不是必须的,传递给apply
的函数并不一定要返回一个标量值,也可以返回带有多个值的Series。

排序与排名

根据某些准则对数据集进行排序是另一个重要的内建操作,需要掌握sort_index
sort_values

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# Series
s1 = pd.Series(range(10,20),index=list('fghjkdsabc'))
s2 = pd.Series(range(20,25),index=range(0,10,2))

# 按索引排序
prints(s1.sort_index())
prints(s1.sort_index(ascending=False))
# 按值排序
prints(s1.sort_values())

# DataFrame
df = pd.DataFrame(np.random.randn(5,4),index=['d','c','a','e','b'],columns=list('CADB'))
prints(df.sort_index()) # 行排序,默认升序
prints(df.sort_index(axis=1)) # 列排序,默认升序
prints(df.sort_values(by='A')) # 列排序
prints(df.sort_values(by=['A','B'])) # 多列排序,类似Order by,先根据A列排 再根据B列排

排名是指对数组从1到有效数据点总数分配名次的操作,需要掌握rank
方法。

import pandas as pd
import numpy as np

obj = pd.Series([7,-5,7,4,2,0,4])
print(obj)
print(obj.rank())
print(obj.rank(ascending=False,method='max'))

frame = pd.DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-2.5]})
print(frame)
print(frame.rank(axis='columns'))

排名中的平级关系打破方法:

方法描述
'average'默认:在每个组中分配平均排名
'min'对整个组使用最小排名
'max'对整个组使用最大排名
'first'按照值在数据中出现的次序分配排名
'dense'类似于method='min'
,但组间排名总是增加1,而不是一个组中的相等元素数量

含有重复标签的轴索引

pandas中并不强制索引标签是唯一的,索引的is_unique
属性可以查看标签是否唯一:

import pandas as pd
import numpy as np


def prints(a):
   print(a)
   print('='*30)


# Series
s1 = pd.Series(list([2689364734]), index=list('fghjkdsabc'))
s2 = s1.unique()  # s2变为了唯一值数组
s3 = pd.Series(list([2689364734]), index=list('aaaaaccccc'))
s4 = s3.unique()
prints(s1)
prints(s2)
prints(s1.index.is_unique)
prints(s3)
prints(s4)
prints(s3.index.is_unique)
prints(s1.value_counts())  # 统计value出现的次数
prints(s1.isin([8]))  # 判断参数值是否在Series中出现,返回布尔类型的Series
prints(s1.isin([82]))

# DataFrame
df = pd.DataFrame(np.random.randint(210size=(54)), index=[
                 'd''c''a''e''b'], columns=list('CADB'))
prints(df)
prints(df.isin([24]))


描述性统计概述与计算

pandas对象装配了一个常用数学、统计学方法的集合,其中大部分属于归约或汇总统计的类别,它们从DataFrame的行或列中抽取一个Series或一系列值的单个值(比如总和或平均值),这些函数内建了处理缺失值的功能。

处理缺失值

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# Series
s1 = pd.Series(list([2,6,8,9,3,6,4,7,3,4]),index=list('fghjkdsabc'))

# DataFrame
df = pd.DataFrame([np.random.randn(3),[1,2,np.nan],[np.nan,4,np.nan],[1,2,3]])
prints(df)

# Step1:判断是否存在缺失值 isnull()
prints(df.isnull())
# Step2:丢弃缺失数据 dropna()
prints(df.dropna(axis=1)) # axis决定按行丢失还是按列丢失
prints(df)
# Step3:填充缺失数据 fillna()
prints(df.fillna(0))
prints(df.fillna({0:9,2:100})) # 第一列的nan替换成9,第三列的nan替换成100
prints(df.fillna(method='ffill',limit=1)) # 用nan上一列的值向下替换nan,limit限制向下填充的nan数量

层级索引

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# Series 层级索引
s1 = pd.Series(np.random.randn(12),index=[list('aaabbbcccddd'),list([0,1,2,0,1,2,0,1,2,0,1,2])])
prints(s1)
prints(type(s1.index))
prints(s1.index)

# Series 索引选取
prints(s1['a',0])
prints(s1['a'])
prints(s1[:,2])

# Series 索引交换 
   # swaplevel() 交换内层和外层索引
prints(s1.swaplevel())
   # sortlevel() 先对外层索引进行排序,再对内层索引进行排序,默认升序
   # pandas的包中在0.23.4版本中就取消了sort方法,老版本的Series和DataFrame对象中还包含这个函数
   # 新版本中推荐使用sort_index和sort_values函数
prints(s1.swaplevel().sort_index())

归约方法与积累型方法

import pandas as pd
import numpy as np

def prints(a):
   print(a)
   print('='*30)

# Series 层级索引
s1 = pd.Series(np.random.randn(12),index=[list('aaabbbcccddd'),list([0,1,2,0,1,2,0,1,2,0,1,2])])
df = pd.DataFrame([np.random.rand(3),[1,2,np.nan],[np.nan,4,np.nan],[1,2,3]],index=list(['Bob','Sam','Tom','Jim']),columns=list(['Math','History','English']))
prints(df)
prints(df.sum()) # nan当作0,或者nan不参与求和计算
prints(df.sum(axis=1))
prints(df.sum(axis=1,skipna=False)) # nan参与计算
prints(df.idxmax()) # 返回最大值的索引
prints(df.cumsum()) # 样本值的累积和
prints(df.describe())

描述性统计和汇总统计方法汇总:

方法描述
count非NA值的个数
describe计算各列的汇总统计集合
min, max计算最小值、最大值
argmin, argmax分别计算最小值、最大值所在的索引位置
idxmin, idxmax分别计算最小值、最大值所在的索引标签
quantile计算样本的从0到1间的分位数
sum加和
mean平均数
median中位数(50%分位数)
mad平均值的平均绝对偏差
prod所有值的积
var值的样本方差
std值的样本标准差
skew样本偏度值(第三时刻)
kurt样本峰度值(第四时刻)
cumsum累积和
cummin, cummax累积和的最小值或最大值
cumprod累积积
diff计算第一个算术差值(对时间序列有用)
pct_change计算百分比

相关性和协方差

相关性和协方差的方法:

方法描述
corr重叠的、非NA的、按索引对齐的值的相关性
corrwith计算两个对象的相关性
cov重叠的、非NA的、按索引对齐的值的协方差
covwith计算两个对象的协方差

唯一值、计数与成员属性

唯一值、计数和集合成员属性的方法:

方法描述
isin计算表征Series中每个值是否包含于传入序列的布尔值数组
match计算数组中每个值的整数索引,形成一个唯一值数组。有助于数据对齐和join类型的操作
unique计算Series值中的唯一值数组,按照观察顺序返回
value_counts返回一个Series,索引是唯一值序列,值是计数个数,按照个数降序排序

计算DataFrame多个相关列的直方图,可参考下面的例子:

data = pd.DataFrame({'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]})
print(data)
# 将pd.value_counts传入apply函数
result = data.apply(pd.value_counts).fillna(0)
print(result)
# 结果中的行标签是所有列中出现的不同值,数值则是这些不同值在每个列中出现的次数


补充知识点

数学期望:如果X离散的随机变量,输出值为x1,x2,...,xn,和输出值相应的概率为p1,p2,...,pn(概率和为1),那么期望值E(X)=x1 * p1 + x2 * p2 + ... + xn * pn

假设有X和Y两个随机变量,它们的均值(期望值)是μX ,μY,它们的标准差是σX以及σY,E代表求数学期望,它们的协方差和相关性可以通过以下式子计算

协方差:covariance σXY=E[(X−μX)(Y−μY)],表示的是两个变量的总体的误差

相关性:correlation ρXY=E[(X−μX)(Y−μY)]/(σXσY),表示的是两个变量的相关性

以上数学概念详细公式可参考协方差百度百科


lambda表达式:Lambda表达式是Python中一类特殊的定义函数的形式,使用它可以定义一个匿名函数。语法如下:

lambda 形参列表 : 函数返回值表达式语句

具体语法可参考以下实例:

li=[{"age":20,"name":"def"},{"age":25,"name":"abc"},{"age":10,"name":"ghi"}]

# 使用lambda表达式
li=sorted(likey=lambda x:x["age"])
print(li)

# 不使用lambda表达式,采用常规函数
def comp(x):
   return x["age"]
li=sorted(likey=comp)
print(li)


 今日も一日、頑張るぞう!💪


文章转载自这是我的葱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论