**
读者须知:
**
1.有些地方用的中文逗号,复制时,请先检查清楚
2.不懂的可以留言
3.不想看我这个又想学习Pandas的可以去下面的链接去学习,不用感谢我!
4.新手博客,还很懒,格式这个样子大家就不要喷我了。
5.如果代码错误,或者方法错误,欢迎留言改正。
学习链接:
这个学习手册有时候访问不进去,你们慢慢试
**
正文:
**
一:什么是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中,顶号和行号互相交换.
- 数字区域读取, 填充数据
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)
- 旋转数据表
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)