Pandas学习手记

**

读者须知:

**
1.有些地方用的中文逗号,复制时,请先检查清楚
2.不懂的可以留言
3.不想看我这个又想学习Pandas的可以去下面的链接去学习,不用感谢我!
4.新手博客,还很懒,格式这个样子大家就不要喷我了。
5.如果代码错误,或者方法错误,欢迎留言改正。
学习链接:

学习pandas视频

学习手册

这个学习手册有时候访问不进去,你们慢慢试

**

正文:

**

一:什么是pandas?
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
pandas提供了大量能使我们快速便捷地处理数据的函数和方法,它是使Python成为强大而高效的数据分析环境的重要因素之一。

二:使用pandas创建excel表格

 使用代码模板:
    import pandas as pd 
    
    df = pd.DataFrame(参数)    -->传的参数必须为字典类型
    df = df.set_index(设置索引)
    df.to_excel(保存路径)
    print(df)
  
  
    代码实例:
    import pandas as pd 
    
    df = pd.DataFrame({'id':[1, 2, 3], 'name':['yuan', 'liang', 'sun']})    -->传的参数必须为字典类型
    df = df.set_index('id', inplace=True)    --> 设置索引  inplace为True的时候就不会重新生产表格,并且修改表格
    df.to_excel('c:/yuan.xlsx')  -->保存路径
    print(df)              --> 打印表格

基础三:使用pandas读取文件

使用代码模板:
 import pandas as pd
 
 people = pd.read_excel(读取文件的路径, index_col='参数')    ,默认参数为第一列
 print(people.shape)     -->多少行和列
 print(people.columns, header= 参数)   -->列的名称  设置请求头的行数  注: header是设置你的获取该行的数据 默认五行,行数可以自定从0开始 当索引为0的行数没有数据的时候自动识别下行数据
 print(people.head(参数))    -->调取前五行  注:默认五行,行数可以自定
 print(people.tail(参数))     -->调取末尾五行  注:默认五行,行数可以自定

操作:

1.pandas 操作行和列

import pandas as pd
 先生成序列对象
 s1 = pd.Series()
	index 行号
	data  --》被废弃
	name  列顶行号 
 Series()的属性
 先创个字典在将字典放入Series中
 
 用序列来做excel
 例 : s1 = pd.series([1,2,3],index=[x,y,z])

 用序列来创
 例 :  s1 = pd.series([1,2,3],index=[1,2,3],name='a')
	s2 = pd.series([10,20,30],index=[1,2,3],name='a')
        s3 = pd.series([100,200,300],index=[1,2,3],name='a') 
	df = pd.DataFrame(s1.name : s1, s2.name : s2, s3.name : s3)
    注:  第一个参数是你要在表格中做的东西
	      第二个参数 index 就是你要放在多少行号上
          第三个参数 name 就是你要在放在多少顶号上

    特注: 用list的方式放入DataFrame中,顶号和行号互相交换.
  1. 数字区域读取, 填充数据
	import pandas as pd
 	books = pd.read_excel('路径',skiprows,usecols,dtype)   读取数据 
        注: skiprows 写你要跳过去读取数据的行数   例你要读取的数据前面空列为,
             则skiprows=3,usecols则要选择你要读取的列名  列读取的数据列名为CDEF 
             则可以写 usecols ="c:f" or usecols= "cdef" ,dtype只能填充为str类型 用字典填充 
             例 dtype[‘id’:str,   .......]
	填充: books[‘填充的列名’].at['填充的数据'] 填充时不能自动填充,所以我们要需要迭代来进行填充

3.数据排序

	import pandas as pd 
	pf = pd.read_excel('路径', index_col='id')
	按一列排序
	pf.sort_values(by='排序的列号名', inplace=True, ascending=False)     inplace在当前的excle中排序不会形成新的Excel,ascending的参数True从小到大 False则从大到小   只能排一次,第二次覆盖第一次
	按多列排序
	pf.sort_values(by=['第一次排序列名,第二次'], inplace=true , ascending=[True, False])       ascending中按前面的by来给参数,每一个参数给一个True或者False
	输出
	print(pf)

4.数据的筛选,过滤

	import pandas as pd
	def age_18_to_30(a):
		return 18<=a<30
		
	def level_a(s):
		return 85<=s<=100
		
	pf = pd.read_excel('路径', index_col='id')
	下面三种方法都可以使用
	pf = pf.loc[表名['列名'].apply(age_18_to_30)].loc[表名['列名'].apply(level_a)]   先筛选第一个列名的值再从第一个列名的值中 .loc 来筛选第二个值
	pf = pf.loc[表名.列名.apply(age_18_to_30)].loc[表名.列名.apply(level_a)]
	pf = pf.loc[表名['列名'].apply(lambda a: 18<=a<30)].loc[表名'列名'].apply(lambda s: 85<=s<=100)]     如果用lambda的话就不用定义上面的函数
	
	print(pf)
	
	代码过长可以用折行\ 
	例 :  pf = pf.loc[表名['列名'].apply(lambda a: 18<=a<30)] \
	            .loc[表名'列名'].apply(lambda s: 85<=s<=100)] 
	
	

5.柱状图

	
	import pandas as pd
	import matplotlib.pyplot as pt
	pf = pd.read_excel('路径')
	排序
	
	方法一: 
	“用pandas来制图”
	pf = pf.sort_values(by='列名',inplace=True, ascending=False)
	print(pf)
	pf.plot.bar(x='列名',y='列名', color='你选择的颜色' , title='你的柱形图的表名')
	把表变成紧凑型
	pt.tight_layout()
	在此处显示
	pt.show()
	
	方法二:
	“用matpmatplotlib来制图”
	pt.bar(表名.列名, 表名.列名, color='颜色')  第一个为X 第二个为Y
	旋转
	pt.xticks(表名.列名, rotation='旋转度数')  第一个为旋转名字,第二个为旋转的度数
	添加x轴的名字
	pt.xlabel('名字')
	添加Y轴的名字
	pt.ylabel('名字')
	添加表名
	pt.title('名字', fontsize='设置标题字体大小')
	紧凑型
	pt.tight_layout() 
	在此显示
	pt.show()


6.分组柱图,深度优化

	import pandas as pd
	import matplotlib.pyplot as pt
	pf = pd.read_excel('路径')
	排序
	pf.sort_values(by='列名',inplace=true, ascending=false)
	print(pf)
	用pandas来制多组柱状图”
	pf.plot.bar(x='列名', y=['列名','列名'], color=['颜色','颜色'])
	设置标题
	pt.title('标题名', fontsize='字体大小', fontweight='字体粗壮  --  bold')
	设置X,Y轴的名字
	pt.xlabel('名字', fontweight='bold')
	pt.ylabel('名字', fontweight='bold')
	设置x的字体样式
	ax=pt.gca()
	ax.set_xticklables(表名['列名'], rotation='旋转角度', ha='方向')
	设置间距
	f  = pt.gcf()
	f.subplots_adjust(left='左边距', bottom='下间距')
	在此显示
	pt.show()


7.叠加柱状图 , 横向柱状图

	
	import pandas as pd 
	import matplotlib.pyplot as pt
	user = pd.read_excel('路径')
	添加新的一列来获取三列的总值
	user['列名'] = user['列名']+user['列名']+user['列名']
	"叠加柱状图"
	user.sort_values(by='新列名排序',inplace=True, ascending=False)
	print(user)
	user.plot.bar(x='列名', y=['列名', '列名', '列名'], stacked=True, title='标题')  stacked就是是否叠加,叠加True反之False
	pt.tight_layout()
	pt.show()
	
	"横向叠加柱状图"
	user.sort_values(by='新列名排序',inplace=True, ascending=True)
	print(user)
	user.plot.barh(x='列名', y=['列名', '列名', '列名'], stacked=True, title='标题')  stacked就是是否叠加,叠加True反之False
	pt.tight_layout()
	pt.show()

	注:横向柱状图用 : plot.barh()
		叠加柱状图用: plot.bar(, stacked=True, )
		横向叠加柱状图用 :  plot.barh(, stacked=True, )


8.饼图

	import pandas as pd
	import matplotlib.pyplot as pt
	
	读取数据
	student = pd.read_excel('路径',index_col='列名')
	print(student)
	制作饼图
	student['2017'].plot.pie(fontsize='饼图的字体大小', counterclock=False, startangle='排序角度')  counterclock是否从小到大排列 True 为是False 为不
	优化饼图
	pt.title('标题',fontsize='字体大小',fontweight='字体样式')
	pt.ylabel('标题',fontsize='字体大小',fontweight='字体样式')
	显示
	pt.show()

9.折线图,和叠加折线图

	
	import pandas as pd
	import matplotlib.pyplot as pt
	student = pd.read_excel('路径',index_col='列名')
	print(student)
	制作折线图
	student.plot(y=['列名','列名',.........])
	制作叠加折线图
	student.plot.area(y=['列名','列名',.........])
	深度优化
	pt.title(同上)
	pt.ylabel(同上)
	pt.xticks(student.index, fontsize='') 这是细化X轴的轴名
	
	显示
	pt.show()

10.散点图,直方图, 密度图

	import pandas as pd
	import matplotlib.pyplot as pt
	
	显示全部列名;
	pd.options.display.amx_columns=最大列数
	student = pd.read_excel('路径',index_col='列名')
	print(student)
	
	制作散点图
	student.plot.scatter(x='列名',y='列名')
	深度优化同上
	显示 
	pt.show()
	
	制作直方图
	student.列名.plot.hist(bins='设置桶')  桶的大小决定直方图的柱的大小
	深度优化
	pt.xticks(range(0, max(student.列名), 500),fontsize , rotation)  自己设置区间每个区间以500来划分
	显示 
	pt.show()
	
	制作密度图
	student.列名.plot.kde()
	pt.xticks(range(0, max(student.列名), 500),fontsize , rotation)  自己设置区间每个区间以500来划分
	显示 
	pt.show()

	密度图和pandas数据分析的相关性
	print(student.corr())

11.多表联合查询

	import pandas as pd
	import matplotlib.pyplot as pt
	显示全部列名;
	pd.options.display.max_columns=最大列数
	student = pd.read_excel('路径',index_col='列名', sheet_name='表名') 在一个Excel中有多个表名时就用sheet_name 
	scores = pd.read_excel('路径',index_col='列名', sheet_name='表名') 在一个Excel中有多个表名时就用sheet_name 
	
	使用merge来进行联合查询
	table = 表一名.merge(表二名, how='left' left_on='联合查询的条件').fillna(0)   
	how使用方法:left or right  如果你用left则表明以左边的表为样本进行查询,反之同理
	left_on:使用左边的条件
	right_on:使用右边的条件
	fillna 使用方法:使没有数据的默认为0
	table.列名 = table.列名.astype(int) 将这表的列名改成int类型
	print(table)
	
	使用join来进行联合查询
	table = 表一名.join(表二名, how='left').fillna(0)  用join时就不需要用on来同列名了
	table.列名 = table.列名.astype(int) 将这表的列名改成int类型
	print(table)

12.数据校验

	import pandas as pd
	校验数据 方法一:
	def score_values(row):
		try:
			assert 0<=row.Score<=100
		except:
			print({row.id} have an invalid score{row.Score})
			
	导入数据
	student = pd.read_excel('路径')
	student.apply(score_values, axis=1)   axis有两个参数第一个是 “0” 0表示是从上到下的去校验 第二个参数是 “1”  1表示从左到右去校验
	
	
	校验数据 方法二:
	def score_values(row):
	if not 0<=row.Score<=100:
		print({row.id} have an invalid score{row.Score})
		
	导入数据
	student = pd.read_excel('路径')
	student.apply(score_values, axis=1)   axis有两个参数第一个是 “0” 0表示是从上到下的去校验 第二个参数是 “1”  1表示从左到右去校验
	

13.把一列数据分成两列

	import pandas as pd 
	
	employees = pd.read_excel('路径', index_col)
	df = employees[列名].str.split('', n=-1, expand=True)  split用法 第一个参数默认为空的话就用空格或者TAB来分割,给参数就按参数来分割, 第二个参数 “n” 如果n=0 or n=-1 就分割后保留所有字符,如果n为其他数则保留你给的位数 第三个参数 expand 默认为false ,为false时不分为两列,为True时分为两列 
	employees[新列名] = df[划分出来的列名]
	employees[新列名] = df[划分出来的列名]
	print(employees)
	
	employees.str.upper() 改为大写
	str方法有很多,去看官方文档.......

14.求和 ,求平均 ,统计导引

	import pandas as pd 
	student = pd.read_excel('路径', index_col)
	查看列的数据
	temp = student[['列名']]
	求平均值
	student['新列名']=temp.sum(axis=1)
	求和
	student['新列名']=temp.mean(axis=1)
	
	汇总
	col_mean = student[['列名']].mean()
	col_mean['列名'] = '新列名'  在列名中添加新名字
	student.append[col_mean,ignore_index=true]
	print(student)
	
	
	官网文档看: API Reference 

15.定位,消除重复数据

	import pandas as pd
	
	student = pd.read_excel('路径', index_col)
	
	判断是否有重复数据并找出来
	dupe = student.duplicated(subset='列名') subset用法 :从一个值中对比时:subset='列名' ,多个值对比时:subset=['列名''...'...]
	dupe = dupe[dupe]
	print(student.iloc[dupe.index])
	
	这里是找出并删除重复数据
	student.drop_duplicates(subset='寻找重复的列名',inplace=True, keep='frist')   keep说明:一共两个参数一个为frist 说明保留前面的数据,一个为last 说明保留后面的数据
	print(student)

  1. 旋转数据表
		import pandas as pd
		
		pd.options.display.max_columns=设置最大数
		student = pd.read_excel('路径', index_col) 
		table = student.transpose()
		print(table)

17.读取 csv文件,tsv文件,txt文件中的数据
csv文件: 文本中用逗号隔开
tsv文件: 文本中用TAB隔开
txt文件: 文本中用 | 隔开

	读取CSV文件的数据:
	import pandas as pd
	
	student = pd.read_csv('路径', index_col)
	print(student)
	
	读取TSV文件的数据
	import pandas as pd
	
	student = pd.read_csv('路径', sep='\t', index_col)
	print(student)
	
	
	读取TXT文件的数据
	import pandas as pd
	
	student = pd.read_csv('路径', sep='|', index_col)
	print(student)
	

18.透视表,分组 , 聚合

	方法一:
	import pandas as pd
	import numpy as np
	
	pd.options.display.max_columns=设置最大数
	student = pd.read_excel('路径', index_col) 
	按照意思来,我只是写个示范
	student['新列名'] = pd.Datetimelndex(student['列名']).year
	
	pt1 = student.pivot_table(index='Category', columns='Year', values='Total', aggfunc=np.sum)	
	print(pt1)
	
	记不到请看 BiiBii: pandas玩转excal第23

19.线性回归,数据预测

	import pandas as pd
	import matplotlib.pyplot as pt
	from scipy.stats import linregress

	sales = pd.read_excel('路径', inplace , dtype)  dtype 有必要时可以设置列的格式
	print(sales)
	
	线性回归方程
	求slope,intercept的值
	slope, intercept, r, p, std_err = linregress(sales.index, sales.Revenue)     slope -- 斜率  intercept --在外轴上的截距  std_err -- 标准差  sales.index -- x轴  sales.Revenue  -- Y轴  然后通过 linregress 来将值预测出来
	线性方程
	exp = sales.index*slope + intercept          exp -- 期望值 
	
	制作散点图
	pt.scatter(sales.index, sales.Revenue)
	制作线性回归方程线
	pt.plot(sales.index, exp, color='设置颜色')
	设置标题
	pt.title(f"y={slope}*x+{intercept}")
	深度优化
	pt.xticks(sales.index,sales.Month,rotation)
	pt.tight_layout()
	ptshow()
	

20.条件格式化

	条件格式化:就是用不同的字体,颜色,背景把数据突显出来,好阅读
	
	import pandas as pd
	import seaborn as sns
	
	设置条件函数:
	def name(按什么条件):
		return 返回条件
	例:
	def low_score_red(s):
		color = 'red' if s<60 else 'black'    这个是改字体颜色
		return f'color : {color}'
	def hight_score_green(col):
		return ['background-color:lime' if s==col.max() else 'background-color: white for s1 in col']    这个是改背景颜色
	
	student = pd .read_excel('路径', inplace)
	student.style.applymap(low_score_red, subset=['列名']).apply(hight_score_green, subset=[列名])
		
	改变背景颜色深浅
	color_map = sns.light_palette('颜色', as_cmap=true)   light_palette  -- 调色板 
	student = pd .read_excel('路径', inplace)
	student.style.background_gradient(color_map, subset=['列名'])
	
	
	背景改成数据条
	import pandas as pd
	student = pd .read_excel('路径', inplace)
	student.style.bar(color='颜色', subset=['路径'])

21.行和列的操作集锦

	操作行:
		
		import pandas as pd
		表一 = pd .read_excel('路径', sheet_name='表一')
		表二 = pd .read_excel('路径', sheet_name='表二')
		追加:
		student = 表一.append(biaoer).reset_index(drop=True)  drop是:是否放弃原来的索引
		print(student)
		
		
		末尾追加手动创建的新行:
		创建一个新行
		stu =pd.Series({'列名:...'})  注意新创行和表里的列名数相同
		追加到末尾
		student = student.append(stu, ignore_index=True)  ignore_index是否自动生成索引,没有索引会报错
		print(student)
		
		
		更改表里的数据:
		student.at[索引值, '更改的列名'] = '修改的新值'
		
		
		替换一行里的数据:
		stu =pd.Series({'列名:...'})  注意替换行和表里的列名数相同    例:stu=pd.Series({'ID':101,'NAME':'222',......})
		student.iloc[索引值]=stu
		
		
		插入新行:
		stu =pd.Series({'列名:...'})  注意新行和表里的列名数相同
		切片来分割表来插入数据
		part1 = student[:20]
		part2 = student[20:]
		student = part1.append(stu, ignore_index=True).append(part2).reset_index(drop=True)
		print(student)
		
		
		删除数据行:
		student.drop(index=[索引], inplace=True)
		再用切片的方法来删除数据
		student.drop(index=student[0:10].index,inplace=True)
		
		
		带条件的删除:
		先按条件筛选出来
		missing = student.loc[筛选条件]
		再删除
		student.drop(index=missing.index, inplace=True)
		student = student.reset_index(drop=True)
		
		
		
		
		
	操作列:
		
		import pandas  as pd
		import numpy as np
		表一 = pd .read_excel('路径', sheet_name='表一')
		表二 = pd .read_excel('路径', sheet_name='表二')
		
		两张表并列放在一起:
		student = pd.concat([表一, 表二], axis=1)  如果不加axis就和上面的append操作一样把表二接到表一后面
		
		
		追加列:
		student['列名']=值        这个值可以自己填   如果要用推导式  就用 np.repeat(0,10)
		
		
		删除列:
		student.drop(columns=[列名], inplace=True)
		
		
		插入列:
		student.insert(列的索引, column='列名' ,value='值')
		
		
		改列名: 
		student.rename(column={'旧名字:新名字',....}, inplace=True)
		
		
		去掉空值操作:
		student.dropna(inplace=True)   凡是有一行有空值就会被删掉
		


		

22.读取数据库

	 import pandas as pd
	 import pyodbc
	 import sqlalchemy
	 连接数据库库
	 conn = pyodbc.connect('deiver={数据库类型}; server=(local); database=数据库表名; user=用户名; password=密码')
	 engine = sqlalchemy.create_engine('mssql+pyodbc://用户名:密码@(local)/数据库表名?driver=数据库类型')
	 
	 写查询语句
	 query = "select * from 表名"
	 
	 df1 = pd.read_sql_query(query, conn)
	 df2 = pd.read_sql_query(query, engine)
	 
	 print(df1)
	 print(df2)

23.编写复杂方程

	import pandas as pd
	import numpy as np
	
	方法一:
	设置计算长方形的外接圆的面积函数
	def get_cir_area(l, h):
		r = np.sqrt(l**2+h**2)/2  得到半径
		return r**2*np.pi     得到面积
		
	def wrapper(row)     获取每一行的长和高
		return get_cir_area(row[’长的列'], row['高的列'])
	
	rects = pd.read_excel('路径', index_col)
	rects['新的列'] = rects.apply(wrapper, axis=1) 
	print(rects)
	
	
	方法二:
	def get_cir_area(l, h):
		r = np.sqrt(l**2+h**2)/2  得到半径
		return r**2*np.pi     得到面积
		
	rects = pd.read_excel('路径', index_col)
	rects['新的列'] = rects.apply(lambda row:get_cir_area(row[’长的列'], row['高的列']), axis=1) 
	print(rects)
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值