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()

在这里插入图片描述

七、数据输出

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐