数据分析师-pandas统计基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析师-pandas统计基础相关的知识,希望对你有一定的参考价值。
参考技术A 一、数值计算和统计1.基本参数axis轴和skipna跳过空值
df.mean() #.mean()默认列计算均值
df.mean(axis=1) #.mean(axis=1)为行计算均值
df.mean(axis=1,skipna=False) #按照行算平均值,直接过滤掉空值和非数值结构;如果想不忽略空值计算,需要skipna参数=False --但是仍然忽略非数值结构
2.计算
df.quantile(q=n) #n分位数 df.std()标准差 df.skew() #样本的偏度 df.kurt()#样本的峰度
3.累计求和/累计求积/累计最大值/累计最小值
df['key1'].cumsum()/.cumprod()/.cummax()/.cummin()
4.保留唯一值:.unique()
5.计数:.value_counts()每个值重复的频率,得到新的Series
s.value_counts(sort=False) #sort参数:对频率排序,默认True
6.成员资格:.isin()类似in 语句,就算只有一个元素也要用[]
s.isin([5]) s.isin([5,13])
二、文本数据
1.通过str访问,且自动忽略丢失/NAN值;不仅适用于值,还适用于列和index
s.str.count('b') #str调用文本数据的方法
df['key2'].str.upper() key2列全部大写
df.columns = df.columns.str.upper() 列名全部大写
2.字符串常用方法:s.str.lower()/s.str.upper()/s.str.len()/s.str.startswith()/s.str.endswith()
3.strip删除空格 lstrip左删除 rstrip右删除:df.columns = df.columns.str.strip()
4.替换:replace(old,new,n替换第几个)
5.分列:split rsplit只用于字符串,适用于Series 和DataFrame
(1)s.str.split(',')[0] #在分列基础上再次选取[]代表选行
(2)s.str.split(',').str[0] #如果想选择值里面的第一列,那就再加个str
s.str.split(',').str.get(1) #与上面的得结果一致,# 可以使用get或[]符号访问拆分列表中的元素
(3)分列后再分多个行:参数expand 默认False不分多行, 参数n最后要拓展几列
s.str.split(',',expand=True,n=1)
6.字符串索引:s.str[0] # 取第一个字符、s.str[:2] # 取前两个字符
三、合并merge、join
1. pd.merge(left,right,on='键',how=’inner‘交集默认/outer/left/right,left_on左面的df以哪列作为键,left_index以左面df的index作为键 ,sort按照键排序)
例:pd.merge(df3,df4,on=['key1','key2'])#多个参考值连接
2. pd.join()-直接通过索引进行连接
(1) .join中suffixes=('_x','_y') 参数:当合并的列明重复时,通过它区分
注:虽然join默认以index为键,但是可以用on改变
四、连接与修补
1..concat([s1,s2],axis=0行=1列,join默认并集=inner交集,join_axes=['a']直指定显示连接后显示的轴)f
(1).concat([])以列表的形式
(2)index参数:是否要根据index进行排序
(3)axis=0默认行+行,axis=1列+列生成df
(4)keys = ['one','two']当axis=0时,keys层次的名称;axis=1时,keys为columns的名称
2.df1.combine_first(df2)#通过index配对后把df2的值修补到df1的NaN上,如果df2的值多于df1会被更新上
#df1.update(df2):df2直接 全部覆盖df1
五、去重及替换:.duplicated/.replace
1..duplicated返回布尔型(True被重复,False没被重复,从上往下依次判断,所以第一个出现肯定不会重复)
2.移除重复.drop_duplicates()inplace默认false,True代替原值
#以上df同样适用
3.替换.replace(通用):注:传入字典,key为old,values为new
六、分组*****
1..groupby(axis=0默认按行(数据)分组=1按列分组;分组后的计算得到新的df;可以单个或多个[]分组)
例:df.groupby('A')返回DataFrameGroupBy,是中间数据
例:df.groupby('A').sum() 返回的是聚合后的数据
df.groupby(['A','B'])可以多行分组 ;df.groupby(['A'])['D'].mean()也可以分组后对某列求聚合函数
2.分组结果是可迭代的对象:
(1) list(df.groupby('X')) #返回[(组名1,df1),(组名2,df2)]#返回list
(2)list(df.groupby('X'))[0]
(3)提取分组 .get_group():df.groupby(['X']).get_group('A') #选择分组后的组A
(4).groups:将分组后的group变成字典dict,key是组名,values是组的index;可以以字典索引方法查看groups里的元素
grouped = df.groupby(['X']), grouped.groups['A']
(5).size()查看分组后的长度 sz = grouped.size()
3.按照数值类型分组:***axis=1按照列进行分组
df.dtypes #返回Series,判断各个值是什么类型
df.groupby(df.dtypes,axis=1).sum() #把Series传入groupby,axis=1按照列进行分组
4.按照字典**:如果特地想把某几列分一组,可以建立字典后分组
mapping = 'a':'one','b':'one','c':'two','d':'two','e':'three'#ab列对应为one,cd列对应为twe,以字典分组
by_column = df.groupby(mapping,axis=1)
by_column.sum()
5.按照Series分组:axis=1按照列进行分组
6.按照函数分组:df.groupby(len).sum() #按照index的字母长度分组
7.多函数计算:.agg(['',''或np.xx]):
df.groupby('a').agg(['mean',np.sum])
df.groupby('a')['b'].agg('result1':np.mean,'result2:':np.sum) #通过dict传入多函数,key为生成结果的columns
七、分组转换拆分-应用-合并:transform、apply
1.数据分组转换transform
(1)方法一、先分组groupby后合并merge等价于transform
(2)方法二、transform会将一个函数应用到各个分组,然后将结果以index全部展现:df.groupby('key2').transform(np.mean)
2.一般化groupby方法:apply--自定义函数,分组后按照该函数运行
df.groupby('key1').apply(f_df1,2) #.apply(函数名,第二个参数)第一个参数默认为apply所执行的
八、数据透视表及交叉表
(1)#透视表 pivot_table(data-df数组,values要聚合的数值,index数透的index,columns透视表的列,aggfunc用于聚合的函数,默认为numpy.mean)
(2)交叉表crosstab 默认情况下,crosstab计算因子的频率表,比如用str的数据透视分析;
#pd.crosstab(Series1,Series2,normalize,values,aggfunc)只接收两个Series,将提供出现的频率表
#参数normalize:默认False将所有值除以值总和进行归一化,=true时显示频率百分比;
#参数values,aggfunc:S1和S2因子聚合后得出values的值并聚合成aggfunc的函数
#参数margins:=True时规格显示的结果并给出行列的总和all
九、数据读取:read_table、read_csv逗号分隔符数据、read_excel
1.读取普通分隔数据::read_table(dfile,delimiter,header=0第0行开始算并为列名,index_col某列开始为索引)可以读取csv和txt
2.读取csv文件***:read_csv(file,engine='python',encoding='utf-8)
3.读取excel文件 read_excel(file,sheetname=[0,1]返回多个sheet/none返回全表--如果是int/string返回的是df,如果是list或None返回的是dict)
Python数据分析大杀器之Pandas基础2万字详解(学pandas基础,这一篇就够啦)
Python数据分析
- 🌸个人主页:JoJo的数据分析历险记
- 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
- 💌如果文章对你有帮助,欢迎关注、点赞、收藏、订阅专栏
本专栏主要介绍python数据分析领域的应用
参考资料:
利用python数据分析
文章目录
- Python数据分析
- 💮1.Series 对象
- 🌹2.DataFrame对象
- 🥀3.pandas基本数据运算
- 🌷4.统计函数
- 🌾5.Pandas缺失值处理
- 🍁6. 层级索引和分层统计
- 🌎7.数据导入
- 🌏8.数据处理
- 🏆文章推荐
我们介绍了Numpy在数据处理方面的应用,本文介绍一下pandas在数据处理方面的应用,pandas可以是基于numpy构建的,但是可以让数据处理变得更便捷
导入相关库
import numpy as np
import pandas as pd
💮1.Series 对象
pandas主要有两个数据对象,一个是Series,类似于一个向量的形式,另一个是DataFrame数据框形式。我们先来看一下如何创建一个Series数据对象。
s = pd.Series([12,-4,7,9])
s
0 12
1 -4
2 7
3 9
dtype: int64
🏵️1.1 Series基本操作
#选择内部元素
s[2]
7
#为元素赋值
s[2]=5
s
s['a'] = 4
s
0 12
1 -4
2 5
3 9
a 4
dtype: int64
#用其它对象定义新的series对象
arr = np.array([1,2,3,4])
#此时s2只是原来的一个动态视图,会随数组的改变而改变,例如我们改变原来数组中的第二个元素值
s2 = pd.Series(arr)
s2
arr[1] = 9
s2
0 1
1 9
2 3
3 4
dtype: int32
#筛选元素
s[s>8]
0 12
3 9
dtype: int64
#Series对象的组成元素
serd = pd.Series([1,0,2,1,2,3], index=['white','white','blue','green','green','yellow'])
serd
white 1
white 0
blue 2
green 1
green 2
yellow 3
dtype: int64
#unique去重 返回一个数组
serd.unique()
array([1, 0, 2, 3], dtype=int64)
#value_counts 去重 返回出现次数
serd.value_counts()
2 2
1 2
3 1
0 1
dtype: int64
#isin 函数,返回布尔值
serd.isin([0,3])
white False
white True
blue False
green False
green False
yellow True
dtype: bool
serd[serd.isin([0,3])]
white 0
yellow 3
dtype: int64
#NaN
s2 = pd.Series([-5,3,np.NaN,14])
s2
0 -5.0
1 3.0
2 NaN
3 14.0
dtype: float64
# 用isnull 和 notnull 来进行判断
s2.isnull()
s2.notnull()
0 True
1 True
2 False
3 True
dtype: bool
s2
0 -5.0
1 3.0
2 NaN
3 14.0
dtype: float64
#用作字典
mydict = 'red':2000,'blue':1000,'yellow':500,'orange':1000
myseries = pd.Series(mydict)
myseries
red 2000
blue 1000
yellow 500
orange 1000
dtype: int64
当出现缺失值时,会直接用NaN替代
colors = ['red','blue','yellow','orange','green']
myseries = pd.Series(mydict, index = colors)
myseries
red 2000.0
blue 1000.0
yellow 500.0
orange 1000.0
green NaN
dtype: float64
进行运算时有NaN为NaN
mydict2 ='red':400,'yellow':1000,"black":700
myseries2 = pd.Series(mydict2)
myseries.fillna(0) + myseries2.fillna(0)
black NaN
blue NaN
green NaN
orange NaN
red 2400.0
yellow 1500.0
dtype: float64
🌹2.DataFrame对象
DataFrame对象是我们在进行数据分析时最常见的数据格式,相当于一个矩阵数据,由不同行不同列组成,通常每一列代表一个变量,每一行代表一个观察数据。我们先来看一下DataFrame的一些基础应用。
创建DataFrame对象
#DataFrame对象
data = 'color':['blue','green','yellow','red','white'],
'object':['ball','pen','pencil','paper','mug'],
'price':[1.2,1.0,0.6,0.9,1.7]
frame = pd.DataFrame(data)
frame
color | object | price | |
---|---|---|---|
0 | blue | ball | 1.2 |
1 | green | pen | 1.0 |
2 | yellow | pencil | 0.6 |
3 | red | paper | 0.9 |
4 | white | mug | 1.7 |
frame2 = pd.DataFrame(data, columns=['object','price'])
frame2
object | price | |
---|---|---|
0 | ball | 1.2 |
1 | pen | 1.0 |
2 | pencil | 0.6 |
3 | paper | 0.9 |
4 | mug | 1.7 |
frame3 = pd.DataFrame(data,index=['one','two','three','four','five'])
frame3
color | object | price | |
---|---|---|---|
one | blue | ball | 1.2 |
two | green | pen | 1.0 |
three | yellow | pencil | 0.6 |
four | red | paper | 0.9 |
five | white | mug | 1.7 |
#选取元素
#获得所有列的名称
frame.columns
Index(['color', 'object', 'price'], dtype='object')
#获得所有行的名称
frame.index
RangeIndex(start=0, stop=5, step=1)
#获得所有值
frame.values
array([['blue', 'ball', 1.2],
['green', 'pen', 1.0],
['yellow', 'pencil', 0.6],
['red', 'paper', 0.9],
['white', 'mug', 1.7]], dtype=object)
#获得某一列的值
frame['price']
0 1.2
1 1.0
2 0.6
3 0.9
4 1.7
Name: price, dtype: float64
#获得行的值 用ix属性和行的索引项
frame.iloc[2]
color yellow
object pencil
price 0.6
Name: 2, dtype: object
#指定多个索引值能选取多行
frame.iloc[[2,4]]
color | object | price | |
---|---|---|---|
2 | yellow | pencil | 0.6 |
4 | white | mug | 1.7 |
#可以用frame[0:1]或者frame[0:2]选择行 但切记frame[0]没有数
frame[0:4]
对DataFrame进行行选择时,使用索引frame[0:1]返回第一行数据,[1:2]返回第二行数据
color | object | price | |
---|---|---|---|
0 | blue | ball | 1.2 |
1 | green | pen | 1.0 |
2 | yellow | pencil | 0.6 |
3 | red | paper | 0.9 |
#如果要获取其中的一个元素,必须依次指定元素所在的列名称、行的索引值或标签
frame['object'][3]
'paper'
#赋值
frame['new']=12 #直接添加某一列
frame
color | object | price | new | |
---|---|---|---|---|
0 | blue | ball | 1.2 | 12 |
1 | green | pen | 1.0 | 12 |
2 | yellow | pencil | 0.6 | 12 |
3 | red | paper | 0.9 | 12 |
4 | white | mug | 1.7 | 12 |
frame['new']=[1,2,3,4,5]
frame
color | object | price | new | |
---|---|---|---|---|
0 | blue | ball | 1.2 | 1 |
1 | green | pen | 1.0 | 2 |
2 | yellow | pencil | 0.6 | 3 |
3 | red | paper | 0.9 | 4 |
4 | white | mug | 1.7 | 5 |
#修改单个元素的方法
frame['price'][2]=3.3
frame
color | object | price | new | |
---|---|---|---|---|
0 | blue | ball | 1.2 | 1 |
1 | green | pen | 1.0 | 2 |
2 | yellow | pencil | 3.3 | 3 |
3 | red | paper | 0.9 | 4 |
4 | white | mug | 1.7 | 5 |
# 删除一整列的所有数据,用del
frame['new'] = 12
frame
del frame['new']
frame
color | object | price | |
---|---|---|---|
0 | blue | ball | 1.2 |
1 | green | pen | 1.0 |
2 | yellow | pencil | 3.3 |
3 | red | paper | 0.9 |
4 | white | mug | 1.7 |
#筛选元素
frame3 = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['red','white','blue','green'],
columns=['ball','pen','pencil','paper'])
frame3
frame3[frame3>12]
ball | pen | pencil | paper | |
---|---|---|---|---|
red | NaN | NaN | NaN | NaN |
white | NaN | NaN | NaN | NaN |
blue | NaN | NaN | NaN | NaN |
green | NaN | 13.0 | 14.0 | 15.0 |
#用嵌套字典生成DataFrame对象 当出现缺失值时用NaN替代
nestdict = 'red':2012:22, 2013:33,'white':2011: 13,2012:22,2013:16,'blue':2011:17,2012:27,2013:48
nestdict
'red': 2012: 22, 2013: 33,
'white': 2011: 13, 2012: 22, 2013: 16,
'blue': 2011: 17, 2012: 27, 2013: 48
frame2 = pd.DataFrame(nestdict)
frame2
red | white | blue | |
---|---|---|---|
2011 | NaN | 13 | 17 |
2012 | 22.0 | 22 | 27 |
2013 | 33.0 | 16 | 48 |
进行转置
frame2.T
2011 | 2012 | 2013 | |
---|---|---|---|
red | NaN | 22.0 | 33.0 |
white | 13.0 | 22.0 | 16.0 |
blue | 17.0 | 27.0 | 48.0 |
#index对象
ser = pd.Series([5,0,3,8,4], index=['red','blue','yellow','white','green'])
ser.index
Index(['red', 'blue', 'yellow', 'white', 'green'], dtype='object')
ser.idxmax()
'white'
ser.idxmin()
'blue'
#含重复标签的Index
serd = pd.Series(range(6), index=['white','white','blue','green','green','yellow'])
serd
white 0
white 1
blue 2
green 3
green 4
yellow 5
dtype: int64
#当一个标签对应多个元素时,返回一个Series对象 而不是单个元素
serd['white']
white 0
white 1
dtype: int64
#判断是否由重复值, is_unique
#索引对象的其他功能
ser = pd.Series([2,5,7,4],index = ['one','two','three','four'])
ser
one 2
two 5
three 7
four 4
dtype: int64
#reindex()函数可以更换series对象的索引,生成一个新的series对象
ser.reindex(['three','one','five','two'])
three 7.0
one 2.0
five NaN
two 5.0
dtype: float64
ser3 = pd.Series([1,5,6,3],index=[0,3,5,6])
ser3
0 1
3 5
5 6
6 3
dtype: int64
#自动插补
#reindex()函数,method:ffill 表示插补的数为前面的值,bfill表示插补的数为后面的值
ser3.reindex(range(6),method='ffill')
0 1
1 1
2 1
3 5
4 5
5 6
dtype: int64
ser3.reindex(range(8),method='bfill')
0 1.0
1 5.0
2 5.0
3 5.0
4 6.0
5 6.0
6 3.0
7 NaN
dtype: float64
frame.reindex(range(5), method='ffill',columns=['colors','price','new','object'])
colors | price | new | object | |
---|---|---|---|---|
0 | blue | 1.2 | blue | ball |
1 | green | 1.0 | green | pen |
2 | yellow | 3.3 | yellow | pencil |
3 | red | 0.9 | red | paper |
4 | white | 1.7 | white | mug |
ser = pd.Series(np.arange(4.),index=['red','blue','yellow','white'])
ser
red 0.0
blue 1.0
yellow 2.0
white 3.0
dtype: float64
ser.drop('yellow')
red 0.0
blue 1.0
white 3.0
dtype: float64
ser.drop(['blue','white'])
red 0.0
yellow 2.0
dtype: float64
frame = pd.DataFrame(np.arange(16).reshape((4,4)),
index=['red','blue','yellow','white'],
columns=['ball','pen','pencil','paper'])
frame
ball | pen | pencil | paper | |
---|---|---|---|---|
red | 0 | 1 | 2 | 3 |
blue | 4 | 5 | 6 | 7 |
yellow | 8 | 9 | 10 | 11 |
white | 12 | 13 | 14 | 15 |
#删除时默认是行 axis指定轴,1为列
frame.drop(['pen'],axis=1)
ball | pencil | paper | |
---|---|---|---|
red | 0 | 2 | 3 |
blue | 4 | 6 | 7 |
yellow | 8 | 10 | 11 |
white | 12 | 14 | 15 |
🥀3.pandas基本数据运算
🌺3.1 算术运算
- 当有两个series或DataFrame对象时,如果一个标签,两个对象都有,则把他们的值相加
- 当一个标签只有一个对象有时,则为NaN
s1 = pd.Series([3,2,5,1],index=['white','yellow','green','blue'])
s1
white 3
yellow 2
green 5
blue 1
dtype: int64
s2 = pd.Series([1,4,7,2,1],['white','yellow','black','blue','brown'])
s1 + s2
black NaN
blue 3.0
brown NaN
green NaN
white 4.0
yellow 6.0
dtype: float64
# DateFrame对象也一样
frame1 = pd.DataFrame(np.arange(16).reshape((4,4)),
columns=['ball','pen','pencil','paper'],
index = ['red','blue','yellow','white'])
frame1
ball | pen | pencil | paper | |
---|---|---|---|---|
red | 0 | 1 | 2 | 3 |
blue | 4 | 5 | 6 | 7 |
yellow | 8 | 9 | 10 | 11 |
white | 12 | 13 | 14 | 15 |
frame2 = pd.DataFrame(np.arange(12).reshape((4,3)),
index = ['blue','yellow','green','white']
,columns=['ball','pen','mug'])
frame2
ball | pen | mug | |
---|---|---|---|
blue | 0 | 1 | 2 |
yellow | 3 | 4 | 5 |
green | 6 | 7 | 8 |
white | 9 | 10 | 11 |
frame3 = frame1+frame2
frame3
ball | mug | paper | pen | pencil | |
---|---|---|---|---|---|
blue | 4.0 | NaN | NaN | 6.0 | NaN |
green | NaN | NaN | NaN | NaN | NaN |
red | NaN | NaN | NaN | NaN | NaN |
white | 21.0 | NaN | NaN | 23.0 | NaN |
yellow | 11.0 | NaN | NaN | 13.0 | NaN |
🌻3.2 基本算术运算符
主要的算术运算符如下
- add() frame1.add(frame2) = frame1+frame2
- sub()
- div()
- mul()
下面通过一些案例来说明
frame = pd.DataFrame(np.arange(16).reshape((4,4)),
columns=['ball','pen','pencil','paper'],
index = ['red','blue','yellow','white'])
frame
ball | pen | pencil | paper | |
---|---|---|---|---|
red | 0 | 1 | 2 | 3 |
blue | 4 | 5 | 6 | 7 |
yellow | 8 | 9 | 10 | 11 |
white | 12 | 13 | 14 | 15 |
ser = pd.Series(np.arange(4),['ball','pen','pencil','paper'])
ser #与frame 的列名称保持一致,行不可以
ball 0
pen 1
pencil 2
paper 3
dtype: int32
frame-ser
ball | pen | pencil | paper | |
---|---|---|---|---|
red | 0 | 0 | 0 | 0 |
blue | 4 | 4 | 4 | 4 |
yellow | 8 | 8 | 8 | 8 |
white | 12 | 12 | 12 | 12 |
当索引项只存在于其中一个数据结构时,那么运算结果会为其产生一个新的索引项,但其值为NaN
具体案例如下,我们给ser增加一列mug
ser['mug'] = 9
ser
ball 0
pen 1
pencil 2
paper 3
mug 9
dtype: int64
frame - ser
ball | mug | paper | pen | pencil | |
---|---|---|---|---|---|
red | 0 | NaN | 0 | 0 | 0 |
blue | 4 | NaN | 4 | 4 | 4 |
yellow | 8 | NaN | 8 | 8 | 8 |
white | 12 | NaN | 12 | 12 | 12 |
🌼3.3 函数映射
在dataframe和series数据对象中,可以使用函数对所有元素进行操作
frame
ball | pen | pencil | paper | |
---|---|---|---|---|
red | 0 | 1 | 2 | 3 |
blue | 4 | 5 | 6 | 7 |
yellow | 8 | 9 | 10 | 11 |
white | 12 | 13 | 14 | 15 |
# 求所有元素的平方根
np.sqrt(frame)
ball | pen | pencil | paper | |
---|---|---|---|---|
red | 0.000000 | 1.000000 | 1.414214 | 1.732051 |
blue | 2.000000 | 2.236068 | 2.449490 | 2.645751 |
yellow | 2.828427 | 3.000000 | 3.162278 | 3.316625 |
white | 3.464102 | 3.605551 | 3.741657 | 3.872983 |
#定义函数
#法一:
f = lambda x:x.max()-x.min()#返回数组取值范围
#法二:
def f(x):
return x.max()-x.min()
# apply函数可以调用定义的函数
frame.apply(f)
ball 12
pen 12
pencil 12
paper 12
dtype: int64
def f(x):
return pd.Series([x.min(),x.max()],index = ['min','max'])
frame.apply(f,axis = 1)
# 默认axis=0
min | max | |
---|---|---|
red | 0 | 3 |
blue | 4 | 7< 以上是关于数据分析师-pandas统计基础的主要内容,如果未能解决你的问题,请参考以下文章 Pandas统计分析基础:画图美观性及基于数据透视表的数据分析 Python数据分析大杀器之Pandas基础2万字详解(学pandas基础,这一篇就够啦) |