Pandas统计分析基础一

一、Pandas概述

注释:

段落注释

"""

"""

单行注释:#

快捷键注释:选中要注释的行 ctrl+/ (取消注释同理)

Pandas(Python Data Analysis Library)是基于NumPy的数据分析模块,它提供了大量标准数据模型和高效操作大型数据集所需的工具,可以说Pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一。

安装pandas的第三方包

如果安装pandas失败,可以先装下pip,如下图

导入方式:import pandas as pd

Pandas有三种数据结构:Series、DataFrame和Panel。

Series类似于一维数组;

DataFrame是类似表格的二维数组;

Panel可以视为Excel的多表单Sheet

二、Series 是一种一维数组对象,包含了一个值序列,并且包含了数据标签,称为索引(index),可通过索引来访问数组中的数据

1、通过列表创建Series

import pandas as pd
obj = pd.Series([1,-2,3,-4])
print(obj)

输出结果

输出的第一列为index,第二列为value,如果创建Series时没有指定index,Pandas会采用从0开始的整型数据作为Series的 index

2、创建Series时指定索引

i = ['a','b','d','c'] 
v = [2,4,5,7]
obj = pd.Series(v,index=i,name='col') 
print(obj)

3、Series位置和标签的使用

val = [2,4,5,6] 
idx1 = range(10,14) 
idx2 = "hello world my baby".split() 
s0 = pd.Series(val) 
s1 = pd.Series(val,index=idx1) 
s2 = pd.Series(val,index=idx2) 
print(s0.index) 
print(s1.index)
print(s2.index) 
print(s0) 
print(s1) 
print(s2) 
print(s0[0]) 
print(s1[10]) 
print(s2["my"])

4、通过字典创建Series

sda = {'a':10,'b':100,'c':500,'d':800} 
obj = pd.Series(sda) 
print(sda) 
print(sda['b'])

5、键值和指定的索引不匹配

如果字典中的键值和指定的索引不匹配,则对应的值是nan或NaN(非数字 not a number)

sda = {'a':10,'b':100,'d':800} 
letter = ['a','b','c','d'] 
obj = pd.Series(sda,index=letter) 
print(obj['c'])
print(sda)

输出结果:

6、不同索引数据的自动对齐

sda = {'a':10,'b':100,'d':800}
obj1 = pd.Series(sda)
letter = ['a','c','d'] 
obj2 = pd.Series(sda,index=letter) 
print(obj1+obj2)

输出结果:

7、Series索引的修改

obj1 = pd.Series([4,8,5,9]) 
obj1.index=['lu','li','zh','w'] 
print(obj1)

三、DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。

  DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。

1、DataFrame的创建

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data) 
print(df)

输出结果

注:创建时可以指定列名的顺序

df = pd.DataFrame(data,columns=['name','year','sex','city'])

2、DataFrame创建时的空缺值

注:如果传入的列在数据中找不到,就会产生NaN的值(例如下面的address)

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data,columns=['name','year','sex','city','address']) 
print(df)

输出结果:

3、创建时指定列名和行索引

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] } 
# 指定行索引 
df = pd.DataFrame(data,columns=['name','sex','year','city'],index=['a','b','c','d']) 
print(df)

输出结果:

4、DataFrame的属性

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data) 
print(df) 
print('值为:',df.values) 
print('索引为:',df.index) 
print('元素的个数:',df.size) 
print('维度:',df.ndim) 
print('形状:',df.shape)

5、使用列数据作为索引

可以通过set_index方法来实现。   

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data) 
#将city列作为索引 
df2 = df.set_index('city') 
print(df2)

输出结果:

6、DataFrame数据的查询

6.1 查询指定的列:可以按名称,也可以按类型

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data) 
df2 = df.set_index('city')
df3 = df[['name','year']] 
#选取int64类型的,默认前5条 
print(df.select_dtypes(include='int64').head())
# 选取非object类型,前2条记录
print(df.select_dtypes(exclude='object').head(2)) 
#选取两列 name,year
print(df3) 

6.2 查询指定的行

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data)
df2 = df.set_index('city') 
df3 = df[['name','year']]
#print(df.select_dtypes(include='int64').head()) #print(df.select_dtypes(exclude='object').head(2)) 
print(df3) 
#显示前两行 
print('选前两行:\n',df[:2]) 
#第二行和第三行 索引(1,2)
print('1-3行:/n',df[1:3]) 

6.3 数据查询

head 和tail是从头或尾连续获取,而sample可以随机抽取数据并显示。

head() #默认获取前5行

head(n)#获取前n行

tail()#默认获取后5行

tail(n)#获取后n行

sample(n)#随机抽取n行显示

sample(frac=0.6)     #随机抽取60%的行

6.4选取行和列

选取行和列

DataFrame.loc(行索引名称或条件,列索引名称)

DataFrame.iloc(行索引位置,列索引位置)

使用loc

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data)
print(df) 
df2 = df.set_index('city')
#选择指定名称的三个列  
print(df.loc[:,['name','year','sex']]) 
#北京和上海的显示姓名和出生年份(注意,要以city作为索引,故加上df2 = df.set_index('city')) 
print(df2.loc[['北京','上海'],['name','year']])
#出生日期大于2000的name和year的值
print(df2.loc[df2['year']>2000,['name','year']])

使用iloc

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data) 
#df2 = df.set_index('city') 
print(df) 
#索引为2的列
print(df.iloc[:,2]) 
#索引1-3行
print(df.iloc[[1,3]]) 
print(df.iloc[[1,3],[1,2]])

输出结果

行和列的选取还可以通过query方法实现

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data) 
print(df.query('year>=2001')) 
print(df.query('year>2001 & year<2004'))

7、删除数据

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data)
df2 = df.set_index('city') 
#df2.drop('上海',axis=0,inplace=True) #删除的上海是按city建立索引的, axis=0按行删除,如果删除李四会报错 
df2.drop('sex',axis=1,inplace=True) # 删除sex列,axis=1是按列删除,inplace==true是否改变原数据 print(df2)

8、数据修改

第一种:直接赋值

第二种:replace

修改数据还可以使用replace进行数据的替换,用法如下:

DataFrame.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method='pad')

其中主要参数to_replace表示被替换的值,value表示替换后的值。同时替换多个值时使用字典数据,

如DataFrame.replace({'B':'E','C':'F'})表示将表中的B替换为E,C替换为F。

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] } 
df = pd.DataFrame(data) 
print(df) 
#把石家庄替换为广州
df.replace(to_replace='石家庄',value='广州',inplace=True) 
print(df)

第三种:修改列名rename

data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data) 
print(df) 
df.rename(columns={'year':'years'},inplace=True) 
print(df)

9、算术运算

9.1 Series数据相加

索引值匹配的相加,不匹配的NaN

obj1 = pd.Series([1,3,5,7],index=['a','c','g','f']) 
print(obj1) 
obj2 = pd.Series([2,4,6,8],index=['a','b','g','h']) 
print(obj2)
print(obj1+obj2)

9.2 DataFrame数据相加

a = np.arange(6).reshape(2,3) 
b = np.arange(4).reshape(2,2) 
df1 = pd.DataFrame(a,columns=['a','b','e'],index=['A','C']) 
print('df1:\n',df1) 
df2 = pd.DataFrame(b,columns=['a','b'],index=['A','C']) 
print('df2:\n',df2)

9.3 函数应用和映射

map函数:将函数套用到Series的每个元素中;

例如:将水果价格表中的“元”去掉。

data = {'fruit':['apple','banana','orange'],'price':['30元','40元','50元']} 
df1 = pd.DataFrame(data) 
print(df1) 
#定义一个方法f 
def f(x): 
  return x.split('元')[0] 
df1['price'] = df1['price'].map(f) 
print(df1)

10、排序

10.1 sort_index()方法:对索引进行排序,默认为升序,降序排序时加参数 ascending=False。

wy = pd.Series([1,-2,4,-4],index=['c','b','a','d'])
print(wy)
print('索引排序后:\n',wy.sort_index()) #排序后,输出的索引为a,b,c,d

10.2 sort_values()方法:对数值进行排序。by参数设置待排序的列名

wy = pd.Series([1,-2,4,-4],index=['c','b','a','d']) 
print(wy) 
print('值排序后:\n',wy.sort_values())

11、汇总与统计

11.1 数据汇总 sum

df2 = pd.DataFrame(np.random.randn(3,3),columns=['a','b','c'],index=['app','win','mac']) print(df2) 
print("按列汇总:\n",df2.sum()) 
print("按行汇总:\n",df2.sum(axis=1))

输出结果:

11.2 数据描述与统计 describe:用来概括整体状况,以及事物间关联,类属关系的统计

df2 = pd.DataFrame(np.random.randn(3,3),columns=['a','b','c'],index=['app','win','mac']) print(df2) 
print(df2.describe())

输出结果:

11.3 unique方法获取不重复的数组,利用value_counts方法实现频数统计

obj = pd.Series(['a','b','c','a','a','c','d']) 
print(obj.unique()) 
print(obj.value_counts())

输出结果:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值