Pandas的用法,全网最简单!保姆级学习,包含pandas的数据清洗、数据处理、数据分析等内容
很多用python做数据处理工作的人,都离不开Pandas;本篇文章包含pandas的所有基础用法,包含数据清洗、数据处理、数据分析、数据可视化、数据输出等内容
·
Pandas的应用
一、Pandas简介
很多用python做数据处理工作的人,都离不开Pandas,我们用两个问题来了解Pandas。
- Pandas是什么呢?
Pandas是一个开源的数据分析和数据处理库,特别适用于处理结构化数据,如表格数据。
- Pandas有什么数据结构?
Pandas有两种数据结构:
1、Series:类似一维数组或列表,含有一维数据和数据标签构成,相当于表格中一列
2、DataFrame:类似二维表格,有行索引、列索引,可进行行列选择、过滤、合并等
二、Series - 一维数组
Series 特点:
1、数据类型:Series可以容纳不同的数据类型元素,如整型、浮点型、字符串、Python对象等
2、索引:Series的每个元素都有一个索引,索引可以是整型、字符型、日期等类型,如果不指定索引,则默认创建从 0 开始的整数类型。
3、数据缺失:Series可包含缺失值,用Nan来表示

2.1 Series 对象的(增、删、改、查)
1、Series的新增(增)
pandas.Series(data=None, index=None, dtype=None) # 只列举常用的参数
# data:数据部分,不提供则为空Series
# index:索引部分,不提供则默认从0开始的整数索引
# dtype:数据类型,如int64、float等,不提供则自动推断数据类型
# 举例
import numpy as np
import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c']) # 使用列表创建,索引为['a','b','c']
s2 = pd.Series(np.array([1,2,3]),dtype=float) # 使用数组创建,索引为[0,1,2]
s3 = pd.Series({'a':1,'b':2,'c':3}) # 使用字典创建,索引为['a','b','c']
print(s1),print(s2),print(s3)

在这里插入代码片
2、Series的删除(删)
import pandas as pd
s = pd.Series([1,2,3,4,5,6,7,8]) # 创建一个 Series
del s[0] # 1、根据索引值直接删除原Series的数据
print(s)
s.drop(s[1],inplace=True) # 2、使用drop删除单个元素,inplace = True 代表删除原 Series 的值
print(s)
s.drop([3,4,5],inplace=True) # 3、使用drop批量删除
print(s)
3、修改Series元素的值(改)
import pandas as pd
s = pd.Series([1,2,3,4,5,6,7,8]) # 创建一个 Series
s[0] = 70
print(s)
4、查看 Series 值(查)
查看Series值,有三种方法:
- 查看单个值:直接使用索引值,就可以获取到值
- 查看多个值:可以使用切片的方式,获取到多个值
- 循环获取值:可以通过循环,获取Series值
# 举例
import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c']) # 使用列表创建,索引为['a','b','c']
s2 = pd.Series([1,2,3,4]) # 使用列表创建,索引为[0,1,2,3]
# 获取单个值,直接用索引值
num1 = s1['b']; num2 = s2[2]
# 获取多个值
num3 = s1['a':'c'] # 获取索引范围 'a' 到 'c' 的数据
num4 = s2[1:3] # 获取索引范围 1 到 3 的数据
print('num1:',num1,', num2:',num2)
print('num3:\n',num3,'\nnum4:\n',num4)

import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c']) # 使用列表创建,索引为['a','b','c']
# 使用for循环获取
for key,value in s1.items():
print(f'索引:{key},元素:{value}')

2.2 Series对象的属性及方法:数据类型、元素个数、统计信息等
import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c']) # 使用列表创建
print('元素:',s1.values) # 元素: [1 2 3]
print('索引:',s1.index) # 索引: Index(['a', 'b', 'c'], dtype='object')
print('数据类型:',s1.dtype) # 数据类型: int64
print('维度:',s1.shape) # 维度: (3,)
print('元素个数:',s1.size) # 元素个数: 3
print('基本信息:',s1.info()) # 基本信息
print('统计信息:',s1.describe()) # 统计信息
print('最大值索引:',s1.idxmax()) # 最大值索引: c
print('最小值索引:',s1.idxmin()) # 最小值索引: a
print('查看前几行数据:',s1.head()) # 查看前几个元素,默认前5
print('查看后几行数据:',s1.tail()) # 查看后几个元素,默认后5
2.3 Series对象的数学计算方法:求和、最大小值、平均值等
import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c']) # 使用列表创建
print('求和:',s1.sum()) # 求和: 6
print('平均值:',s1.mean()) # 平均值: 2.0
print('标准差:',s1.std()) # 标准差: 1.0
print('最大值:',s1.max()) # 最大值: 3
print('最小值:',s1.min()) # 最小值: 1
2.4 Series对象数据条件过滤、筛选数据
import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c']) # 使用列表创建
print(s1 > 2) # 返回数据是否满足条件
print(s1[s1>2]) # 直接返回数据筛选结果
print(s1[s1*2 > 3]) # 所有数据都 * 2 再筛选大于3的数据
三、DataFrame - 二维数组
DataFrame 的特点:
- 二维结构:可以将 DataFrame 看做Excel表格或SQL的表,具有行列。
- 列:不同列可以包含不同的数据类型,例如整数、浮点、字符串、对象等
索引:拥有行索引、列索引,相当于 Excel的行号和列标
pandas.DataFrame(data=None, index=None, columns=None, dtype=None)
# data:数据,可以是列表、字典、对象等
# index:行索引,可以是数组、列表、字符串等;默认从0开始的整数
# columns:列索引,可以是数组、列表、字符串等;默认从0开始的整数
# dtype:数据类型
3.1 DataFrame对象的增、删、改、查
1、新增DataFrame对象(增)
- 以下方式是通过数据导入方式进行数据新增。
import pandas as pd
data = pd.read_excel('数据/数据表1.xls') # 导入excel 表数据
df = pd.DataFrame(data) # 转成 DataFrame 格式
print(df)
- 以下四种新增方式是对现有的列表、字典数据进行新增。
import pandas as pd
# 1、使用列表创建DataFrame
data1 = [
['Tom',10,98.1],
['Lili',20,90],
['Amy',30,99.9]
]
df1 = pd.DataFrame(data1,columns=['Name','Age','Score'])
print(df1)
# 2、使用字典创建DataFrame(竖向创建)
data2 = {
'Name':['Tom','Lili','Amy'],
'Age':[10,20,30],
'Score':[98.1,90,99.9]
}
df2 = pd.DataFrame(data2)
print(df2)
# 3、使用字典创建DataFrame(横向创建)
data3 = [
{'Name':'Tom','Age':10,'Score':98.1},
{'Name':'Lili','Score':99.1},
{'Name':'Amy','Age':30}
]
df3 = pd.DataFrame(data3)
print(df3)
# 4、通过Series方式创建DataFrame
s1 = pd.Series(['Tom','Lili','Amy'])
s2 = pd.Series([10,20,30])
s3 = pd.Series([90.8,80,99.9])
df = pd.DataFrame([s1,s2,s3],columns=['Name','Age','Score'])
print(df)
- 对现有的DataFrame对象进行数据新增
import pandas as pd
data1 = [['Tom',10,98.1],['Lili',20,90],['Amy',30,99.9]]
df1 = pd.DataFrame(data1,columns=['Name','Age','Score'])
# 1、df1新增一列数据
df1['City'] = ['Shanghai','Beijing','Sichuan']
# 2、df1新增一行数据
df1.loc[4] = ['Daming',23,88.8,'Beijing']
2、删除DataFrame对象(删)
import pandas as pd
data1 = [['Tom',10,98.1],['Lili',20,90],['Amy',30,99.9]]
df1 = pd.DataFrame(data1,columns=['Name','Age','Score'])
# 直接写列索引,axis=1表示删除列,0表示删除行;inplace表示在df1上进行删除
df1.drop('Name',axis=1,inplace=True)
# 直接写行索引进行删除,并形成新的DateFrame,axis默认为0,可以不写axis
df_droprow = df1.drop(1)
# 删除多行数据
df_droprows = df1.drop([1,2])
# 删除多列数据
df_dropcols = df1.drop(['Age','Score'],axis=1)
# 删除整个DataFrame
del df_dropcols
3、修改DataFrame对象(改)
import pandas as pd
data1 = [['Tom',10,98.1],['Lili',20,90],['Amy',30,99.9]]
df1 = pd.DataFrame(data1,columns=['Name','Age','Score'])
df1['Name'] = ['Tom_A','Lili_A','Amy_A'] # 对列进行修改
df1.loc[1] = [11,22,33] # 对行进行修改
df1.loc[2,'Score'] = 100 # 修改某个值
print(df1)
4、查询DataFrame对象(查)
import pandas as pd
data1 = [['Tom',10,98.1],['Lili',20,90],['Amy',30,99.9]]
df1 = pd.DataFrame(data1,columns=['Name','Age','Score'])
print(df1['Name']) # 获取单列数据
print(df1.Name) # 获取单行数据
print(df1[['Name','Age']]) # 获取多列数据
print(df1.loc[1]) # 获取单行数据
print(df1[0:2]) # 获取多行数据
print(df1.loc[1:2,['Name','Age']]) # 获取区域数据
print(df1.iloc[:2,1:]) # 获取区域数据
3.2 对DataFrame数据进行计算、信息查询
- 因为DataFrame就是由多个 Series 进行合并的,所以很多对 Series 的操作,就可以在DataFrame上进行单列操作。
import pandas as pd
data1 = [['Tom',10,98.1],['Lili',20,90],['Amy',30,99.9]]
df1 = pd.DataFrame(data1,columns=['Name','Age','Score'])
# 多字段求和、最大值、最小值,针对整数、浮点等可计算的列
print('多字段求和:',df1.sum())
print('多字段求最大值:',df1.max())
print('多字段求最小值:',df1.min())
# 单个字段进行计算,和 Series 一样
print('求和:',df1['Score'].sum()) # 求和: 288.0
print('最大值:',df1['Age'].max()) # 最大值: 30
print('最小值:',df1['Age'].min()) # 最小值: 90.0
print('平均值:',df1['Score'].mean()) # 平均值: 96.0
print('标准差:',df1['Score'].std()) # 标准差: 5.273518749374085
print('数据筛选:',df1[df1['Age'] > 15]) # 数据筛选
print('索引:',df1.index)
print('元素:',df1.values)
print('数据类型',df1['Score'].dtype)
print('维度:',df1.shape)
print('元素个数:',df1.size)
print('基本信息:',df1.info())
print('统计信息:',df1.describe())
print('最大值索引:',df1['Score'].idxmax())
print('最大值索引:',df1['Score'].idxmin())
print('查看前几行数据:',df1.head())
print('查看后几行数据:',df1.tail())
四、数据清洗
4.1、清洗空值数据
数据表:
import pandas as pd
data1 = pd.read_csv('数据表.csv')
df1 = pd.DataFrame(data1)
# 1、使用固定数据填充空值,如:用固定值30填入age列空值;有以下两种方法
df1['age'].fillna(30,inplace=True) # 1、使用 fillna 函数进行默认值填充
df1.loc[df1['age'].isnull(),'age'] = 30 # 2、查找到空值的位置,再写入默认值
# 2、可以使用其他统计数据进行填充空值,比如平均值,最大值,最小值
df1.loc[df1['age'].isnull(),'age'] = df1['age'].mean()
# 3、通过对某列筛选,进行空值填写;如当age>30,Score列空值填入Score的最大值
df1.loc[(df1['age'] > 30) & (df1['Score'].isna()),'Score'] = df1['Score'].max()
# 4、用dropna删除带有空值的行
df1.dropna(axis=0,inplace=True) # axis=0 删除带有空值的行,axis=1删除列,inplace=True在原表中操作
df1.dropna(subset=['age','Score'],inplace=True) # 删除'age','Score'列中带有空值的行
4.2、清洗重复数据
import pandas as pd
df = pd.DataFrame({'col1':['A','B','A'],'col2':[1,2,1]})
print(df.duplicated()) # 检测重复行
df.drop_duplicates(inplace=True) # 删除重复行
4.3、清洗错误数据:替换、去空白、大小写转换、整型化
import pandas as pd
df = pd.DataFrame({
'A': [1.1, 2.2, 2, 3.4, 4],
'B': [5, 6, 6, 7, 8],
'C': ['aa', 'b ', 'c', 'b ', 'c']
})
df.loc[df['C'] == 'c','C'] = 'cc' # 数据替换:使用loc,根据条件进行数据替换
df['C'].replace('a','aa',inplace=True) # 数据替换:使用replace进行条件数据替换
df['D'] = df['C'].str.strip() # 去空白:去除某一列空白
df['E'] = df['C'].str.title() # 首字母大写
df['F'] = df['C'].str.lower() # 将字符全部转成小写
df['G'] = df['C'].str.upper() # 将字符全部转成大写
df['A'] = df['A'].astype(int) # 将数据整数化
五、数据处理
5.1、数据分列、数据合并
import pandas as pd
data1 = pd.read_csv('数据表.csv')
df1 = pd.DataFrame(data1)
# 1、数据分列,分隔符进行分列;首先转成str类型,再用split进行分列,[1]再取第二列数据得到date
df1[['Name','date_N']] = df1['date'].str.split('_',expand=True)
# 2、数据合并
df1['ALL'] = df1['name'] +'_'+ df1['City']
5.2、分组排序
import pandas as pd
import numpy as np
df = pd.DataFrame({
'Group1':['A','A','B','B','B'],
'Group2':['C','C','C','D','D'],
'Value1':[3,2,1,5,6],
'Value2':[20,30,40,10,50]
})
#
# # 分组排序:对Group列进行分组,Value进行倒序排列 ascending=True为正序
df_sort = df.sort_values(by=['Group1','Value1'],ascending=False)
# # 分组求和\求平均值\求个数:对‘Group’列进行分组,Value列进行求和\求平均\求个数
df_sum = df.groupby('Group1').sum() # 分组求和
df_mean = df.groupby('Group1')['Value1'].mean() # 分组对某字段求平均
df_count = df.groupby(['Group1','Group2']).count() # 对两个字段分组求个数
df_dr = df.groupby('Group1').agg({'Value1':np.sum,'Value2':np.mean}) # 对不同数据列进行不同的分组操作
df_all = df.groupby(['Group1','Group2'])['Value1'].agg([np.sum,np.mean,np.max]) # 对数据进行批量操作
5.3、分段处理
import pandas as pd
data = pd.DataFrame({'Score':[25, 2, 90, 4, 60,8,20,10,18,7]}) # 将成绩化成A\B\C三等
result = pd.cut(data['Score'], bins=[0,60,80,100],labels=['C','B','A']) # bins 是分类的界限,labels是分类标签
print(result)
5.4、数据映射、数据计算 map 的使用
map函数根据传入参数不同有两种运用:
- 传入字典:做数据映射
- 传入函数:做数据运算
1、参数传入字典——做数据映射
import pandas as pd
df = pd.DataFrame({
'Name':['Tom','Dati','Amy','Sara','Lili'],
'Sex':['F','M','F','F','M']})
dic = {'F':'女','M':'男'}
df['性别'] = df['Sex'].map(dic) # map传入字典数据,起到数据映射的作用
print(df)
2、参数传入函数——做数据计算
import pandas as pd
df = pd.DataFrame({
'Name':['Tom','Dati','Amy','Sara','Lili'],
'Sex':['F','M','F','F','M'],
'Age':[10,20,30,40,50]})
df['Age+10'] = df['Age'].map(lambda x:x+10) # map传入字典函数,起到数据计算的作用
print(df)
六、数据可视化分析
6.1 柱状图
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑色
# 创建数据
data = {
'月份':[1,2,3,4,5,6,7,8,9],
'利润':[100,23,44,45,67,54,32,12,34],
'销售额':[123,234,312,56,122,288,234,123,45]
}
df = pd.DataFrame(data)
plt.figure()
ax = df.plot(x='月份',y=['销售额','利润'],kind = 'bar',width=0.5)
# ax = df.set_index('月份').plot(kind='bar')
plt.title = '每月销售情况' # 设置柱状图标题
plt.xlabel = '月份' # 设置x轴标题
plt.ylabel = '金额' # 设置x轴标题
plt.legend(title='指标',loc='upper left') # 设置图例,在左上方
# 添加数据标签
for p in ax.patches:
ax.annotate(f'{p.get_height()}', (p.get_x() + p.get_width() / 2., p.get_height()),
ha='center', va='bottom')
plt.savefig('销售柱状图.png') # 将柱状图保存下来
plt.show() # 画出柱状图
6.2 折线图
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑色
# 创建数据
data = {
'月份':[1,2,3,4,5,6,7,8,9],
'利润':[100,23,44,45,67,54,32,12,34],
'销售额':[123,234,312,56,122,288,234,123,45]
}
df = pd.DataFrame(data)
plt.figure()
df.plot(x='月份',y=['销售额','利润'] # x,y 轴数据
,kind = 'line' # 图形类别,line 是折线图
,linestyle='--' # 折线图形式
,linewidth=2 # 线的大小
,marker='o') # 设置数据点标记
plt.title = '每月销售情况' # 设置柱状图标题
plt.xlabel = '月份';plt.ylabel = '金额' # 设置x,Y轴标题
plt.grid() # 添加网格
plt.legend(title='指标',loc='upper left') # 设置图例,在左上方
plt.xlim(0,12);plt.ylim(0,350) # 设置x,y轴范围
plt.savefig('销售柱状图.png') # 将柱状图保存下来
plt.show() # 画出柱状图
# 添加数据标签
for x,y in zip(df['x'],df['y']):
plt.text(x,y,y,ha='center',va='bottom')

6.3 饼图
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑色
# 创建数据
data = {
'类别':['A','B','C','D'],
'占比':[10,20,50,20]
}
df = pd.DataFrame(data)
plt.figure()
df.plot(kind='pie' # pie 表示饼图
,y='占比' # 设置 y 值
,autopct='%1.1f%%' # 设置百分比
,labels=df['类别'], # 设置饼图的labels值
explode = (0.1,0,0,0) # 凸显出第一部分
,startangle = 90) # 设置饼图起始角度
plt.title('类别饼状图') # 设置图标名称
plt.legend(df['类别'],title='类别',loc='upper right') # 设置图例
plt.savefig('饼图.png') # 保存饼图
plt.show()

七、数据输出
更多推荐
所有评论(0)