python(pandas模块)

1.什么是pandas?

  • numpy模块和pandas模块都是用于处理数据的模块。
  • numpy主要用于针对数组进行统计计算,处理数字数据比较方便。
  • pandas除了可以处理数字数据,还可以处理字符串数据,再其模块中包含两种数据类型
    • 一维数据类型:Series
    • 二维: DataFrame
    • 三维: Panel …
    • 四维: Panel4D …
    • N维: PanelND …
      最常用的数据类型是一维和二维

pandas创建Series数据类型

import pandas as pd
# 查看pandas的版本号
print(pd.__version__)

在这里插入图片描述

1. 通过列表创建Series对象
# 通常将pandas模块名起作pd
import pandas as pd
li=['包子','馒头','煎饼']
# 不指定索引,行号默认从0开始
data1 = pd.Series(data=li)
print(data1)
# 指定索引
data2=pd.Series(data=li,index=["A","B","C"])
print(data2)
print(type(data2))

在这里插入图片描述

2. 通过numpy的对象Ndarray创建Series
import pandas as pd
import numpy as np
# 随机生成5个小数
arry=np.random.randn(5)
data=pd.Series(data=arry)
print(data)
# 修改元素的数据类型
print(data.astype(np.int))
# 修改元素保留三位小数
print(data.round(3))
print(type(data))

在这里插入图片描述

3. 通过字典创建Series对象
import string
import pandas as pd
dict = {string.ascii_lowercase[i]:i for i in range(10)}
# 数据的行号为字典的key值,数据的元素为字典的value值
s3 = pd.Series(dict)
print(s3)

在这里插入图片描述

Series基本操作

1. 修改Series索引
import pandas as pd
import numpy as np
import  string
array = ["粉条", "粉丝", "粉带"]
s1 = pd.Series(data=array)
print(s1)
# 修改Series索引
s1.index=['A','B','C']
print(s1)

在这里插入图片描述

2. Series纵向拼接
array = ["粉条", "粉丝", "粉带"]
s2 = pd.Series(data=array)
# Series竖直拼接
s3=s1.append(s2)
print(s3)

在这里插入图片描述

3. 删除指定索引对应的元素
# 3). 删除指定索引对应的元素;
s3 = s3.drop('C')  # 删除索引为‘C’对应的值;
print(s3)

在这里插入图片描述

4. 根据指定的索引查找元素
print(s3['B'])
# 根据指定索引修改元素
s3['B'] = np.nan
print(s3)

在这里插入图片描述

5. 切片操作 — 同列表
print(s3[:2])   # 显示前两个元素
print(s3[::-1]) # 显示除最后一个元素外的所有元素
print(s3[-2:])  # 显示最后两个元素

在这里插入图片描述

Series的基本运算

按照对应的索引进行计算, 如果索引不同,则填充为Nan
import pandas as pd
import numpy as np
import  string
# 创建两个Series对象
s1  = pd.Series(np.arange(5), index=list(string.ascii_lowercase[:5]))
s2  = pd.Series(np.arange(2, 8), index=list(string.ascii_lowercase[2:8]))

print(s1)
print(s2)

在这里插入图片描述

# 加法
print(s1 + s2)
print(s1.add(s2))


# 减法
print(s1 - s2)
print(s1.sub(s2))


# 乘法
print(s1 * s2)
print(s1.mul(s2))


# 除法
print(s1 / s2)
print(s1.div(s2))



# 求中位数
print(s1)
print(s1.median())


# 求和
print(s1.sum())


# 求最大值
print(s1.max())

# 求最小值
print(s1.min())

在这里插入图片描述

特殊的where方法

series中的where方法运行结果和numpy中完全不同
  • numpy中的where方法可以用来查找数据中符合不等式的索引,也可以将数据中符合不等式的元素重新赋值
  • pandas的series中的where方法只能将数据中符合不等式的元素重新赋值
import pandas as pd
import numpy as np
import  string

s1 = pd.Series(np.arange(5), index=list(string.ascii_lowercase[:5]))
# s1中小于3的元素赋值为缺失值
print(s1.where(s1 > 3))

# 对象中小于3的元素赋值为10;
print(s1.where(s1 > 3, 10))

# 对象中大于3的元素赋值为10;
print(s1.mask(s1 > 3, 10))

在这里插入图片描述

创建DataFrame数据类型

方法1: 通过列表创建
import pandas as pd
li = [
    [1, 2, 3, 4],
    [2, 3, 4, 5]
]

# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
d1 = pd.DataFrame(data=li, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d1)

在这里插入图片描述

方法2: 通过numpy对象创建
import pandas as pd
import numpy as np
narr = np.arange(8).reshape(2, 4)
# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
d2 = pd.DataFrame(data=narr, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d2)

在这里插入图片描述

方法三: 通过字典的方式创建
import pandas as pd
# 字典中的key值为数据中的列索引
# 字典中的value值为数据中的元素
dict = {
    'views': [1, 2, ],
    'loves': [2, 3, ],
    'comments': [3, 4, ]

}
# index中的行索引必须和字典中key-value值个数相对应
d3 = pd.DataFrame(data=dict, index=['粉条', "粉丝"])
print(d3)

在这里插入图片描述

4.日期操作的特例:
# date_range() :生成日期索引值对象的函数
# start表示起始日期;end表示截至日期;
# freq表示按xx间隔将起始到截至日期分隔开(默认以一天为间隔);periods表示xx个分组
dates = pd.date_range(start='1/1/2018', end='1/08/2018')
print(dates)

在这里插入图片描述

# 行索引
dates = pd.date_range(start='today', periods=6)
# 数据
data_arr = np.random.randn(6, 4)
# 列索引
columns = ['A', 'B', 'C', 'D']
d4 = pd.DataFrame(data_arr, index=dates, columns=columns)
print(d4)

在这里插入图片描述

练习:

一维对象: 建立一个以2019年每一天作为索引, 值为随机数;

import pandas as pd
import numpy as np

dates=pd.date_range(start='1/01/2019',end='12/31/2019',freq='D')
data=np.random.randn(len(dates))
s=pd.Series(data=data,index=dates)
# 查看前5行
print(s.head())
# 查看后5行
print(s.tail())

在这里插入图片描述

DataFrame的基本操作

# 先创建一个DataFrame对象用于测试
import pandas as pd
import numpy as np

narr = np.arange(8).reshape(2, 4)
# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
d2 = pd.DataFrame(data=narr, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d2)

在这里插入图片描述

1. 查看基础属性
print(d2.shape)  # 获取行数和列数;
print('*'*30)
print(d2.dtypes)  # 列数据类型
print('*'*30)
print(d2.ndim)  # 获取数据的维度
print('*'*30)
print(d2.index) # 行索引
print('*'*30)
print(d2.columns) # 列索引
print('*'*30)
print(d2.values, type(d2.values))   # 对象的值, 二维ndarray数组;

在这里插入图片描述

2. 数据整体状况的查询
# 相关信息的预览: 行数, 列数, 列类型, 内存占用
print("info:", d2.info())

print("统计".center(50, '*'))
# 快速综合用计结果: 计数, 均值, 标准差, 最小值, 1/4位数, 中位数, 3/4位数, 最大值;
print(d2.describe())

在这里插入图片描述

3.转置及按列排序
# 3). 转置操作
print(d2.T)
print('*'*30)
# 4). 按列进行排序
print(d2)
# 按照指定列进行排序, 默认是升序, 如果需要降序显示,设置ascending=False;
print(d2.sort_values(by="views", ascending=False))

在这里插入图片描述

4.切片及查询
print(d2[:1])   # 可以实现切片, 但是不能索引;
print('*'*30)
print('1:\n', d2['views'])   # 通过标签查询, 获取单列信息
print('2:\n', d2.views)   # 和上面是等价的;
print('*'*30)
print(d2[['views', 'comments']])  # 通过标签查询多列信息

在这里插入图片描述

5.通过类似索引的方式查询
  • iloc(通过位置进行行数据的获取),
  • loc(t通过标签索引行数据)
print(d2)
print('第一行元素:\n')
# iloc查询
print(d2.iloc[0])
# loc查询
print(d2.loc['A'])
print('第二行元素:\n')
# iloc查询
print(d2.iloc[-1:])
# loc查询
print(d2.loc['B'])

在这里插入图片描述
在这里插入图片描述

6. 更改pandas的值

类似于列表根据索引修改值,通过iloc或loc方法进行修改pandas的值

print(d2)
d2.loc['A'] = np.nan
print(d2)

在这里插入图片描述

从文件中读取数据

1. csv文件的写入
df = pd.DataFrame(
    {'province': ['陕西', '陕西', '四川', '四川', '陕西'],
     'city': ['咸阳', '宝鸡', '成都', '成都', '宝鸡'],
     'count1': [1, 2, 3, 4, 5],
     'count2': [1, 2, 33, 4, 5]
     }
)

df.to_csv('doc/csvFile.csv')
print("csv文件保存成功")

在这里插入图片描述

2. csv文件的读取
# 在读取的过程中,会将csv文件中行索引读取出来,另起一列Unnamed: 0
df2 = pd.read_csv('doc/csvFile.csv')
print(df2)

在这里插入图片描述

3. excel文件的写入
df2.pop('Unnamed: 0')
df2.to_excel("/tmp/excelFile.xlsx", sheet_name="省份统计")
print("excel文件保存成功")

在这里插入图片描述

分组与聚合操作之groupby

pandas提供了一个灵活高效的groupby功能,

  • 它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。
  • 根据一个或多个键(可以是函数、数组或DataFrame列>名)拆分pandas对象。
  • 计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。
import pandas as pd

df = pd.DataFrame(
    {'province': ['陕西', '陕西', '四川', '四川', '陕西'],
     'city': ['咸阳', '宝鸡', '成都', '成都', '宝鸡'],
     'count1': [1, 2, 3, 4, 5],
     'count2': [1, 2, 33, 4, 5]
     }
)

# 根据某一列的key值进行统计分析;
# 根据province这一列进行对count1这一列的统计分析
# 将province中的相同元素分为一组
grouped = df['count1'].groupby(df['province'])
print(grouped.describe())
# 将每一组的count1中的元素取中值
print(grouped.median())

在这里插入图片描述

import pandas as pd

df = pd.DataFrame(
    {'province': ['陕西', '陕西', '四川', '四川', '陕西'],
     'city': ['咸阳', '宝鸡', '成都', '成都', '宝鸡'],
     'count1': [1, 2, 3, 4, 5],
     'count2': [1, 2, 33, 4, 5]
     }
)
print(df)
# 根据城市统计分析cpunt1的信息;
grouped = df['count1'].groupby(df['city'])
print(grouped.max())

在这里插入图片描述

import pandas as pd

df = pd.DataFrame(
    {'province': ['陕西', '陕西', '四川', '四川', '陕西'],
     'city': ['咸阳', '宝鸡', '成都', '成都', '宝鸡'],
     'count1': [1, 2, 3, 4, 5],
     'count2': [1, 2, 33, 4, 5]
     }
)
print(df)
# 指定多个key值进行分类聚合;
grouped = df['count1'].groupby([df['province'], df['city']])
print(grouped)
print(grouped.max())
# 统计各个城市的count1的总和
print(grouped.sum())
# 统计各个城市出现的次数
print(grouped.count())
#  通过unstack方法, 实现层次化的索引;
# 将province这个大分组当作行索引,city这个小分组当作列索引
print(grouped.max().unstack())

在这里插入图片描述
在这里插入图片描述

案例1_商品数据分析

  • 文件名称: doc/chipo.csv
  • 文件描述: 每列数据分别代表如下: 订单编号, 订单数量, 商品名称, 商品详细选择项, 商品单价
需求1:
  • 从文件中读取所有的数据;
  • 获取数据中所有的商品名称;
  • 跟据商品的价格进行排序, 降序,将价格最高的20件产品信息写入mosthighPrice.xlsx文件中;
import pandas as pd
import numpy as np
"""
需求1:
    1). 从文件中读取所有的数据;
    2). 获取数据中所有的商品名称;
"""
# 读取文件信息
df=pd.read_csv('doc/chipo.csv')
# 去掉索引列
df.pop('Unnamed: 0')
# 取出所有商品名称
itemName=df['item_name'].values
print(itemName)

在这里插入图片描述

# 3).跟据商品的价格进行排序, 降序,将价格最高的20件产品信息写入mosthighPrice.xlsx文件中;
# 取出商品单价,并去掉$符号,再转成浮点型
price=df['item_price'].str.strip('$').astype(np.float)
# 添加一列处理好的单价信息
df['price']=price
# 将商品按添加的一列单价信息进行降序排序,并取前20行
df=df.sort_values('price',ascending=False).head(20)
# 去掉添加的一列单价信息
df.pop('price')
df.to_excel('/tmp/item.xlsx')

在这里插入图片描述

需求2:
  • 统计列[item_name]中每种商品出现的频率,绘制柱状图
    (购买次数最多的商品排名-绘制前5条记录)
  • 根据列 [odrder_id] 分组,求出每个订单花费的总金额。
  • 根据每笔订单的总金额和其商品的总数量画出散点图。
# 1). 统计列[item_name]中每种商品出现的频率,绘制柱状图(购买次数最多的商品排名-绘制前5条记录)
import pandas as pd
from pyecharts import Bar
df=pd.read_csv('doc/chipo.csv')
df.pop('Unnamed: 0')
# 将数据按商品名称分组,并求每组商品数量的总和
count=df['quantity'].groupby(by=df['item_name']).sum()
# 将数据降序排序,并取前5行
data=count.sort_values(ascending=False).head()
bar=Bar('柱状图')
bar.add('',data.index,data.values)
bar.render('bar.html')

在这里插入图片描述

# 2). 根据列 [odrder_id] 分组,求出每个订单花费的总金额。
import pandas as pd
import numpy as np
df=pd.read_csv('doc/chipo.csv')
df.pop('Unnamed: 0')
# 取出商品单价,并去掉$符号,再转成浮点型
price=df['item_price'].str.strip('$').astype(np.float)
# 添加一列处理好的单价信息
df['price']=price
# 将数据的quantity列和price列相乘得到每一行总价
all_price=df['quantity']*df['price']
# 将总价信息添加到数据的一列中
df['all_price']=all_price
# 按订单号进行分组,求每个订单号的总价
data=df['all_price'].groupby(by=df['order_id']).sum()
print(data)
# 3). 根据每笔订单的总金额和其商品的总数量画出散点图。
# 按订单号进行分组,求每个订单号的商品总数
count=df['quantity'].groupby(by=df['order_id']).sum()
sc=Scatter('散点图')
sc.add('',data,count)
sc.render('scatter.html')

在这里插入图片描述
在这里插入图片描述

字符串的操作

在一维数组Series中有.str方法,可以对数组内的元素进行字符串操作

import pandas as pd
import numpy as np

series1= pd.Series(['$A:1', '$B:2', '$C:3', np.nan, '$cat:3'])
print(series1)

# 将所有的字母转换为小写字母, 除了缺失值
print(series1.str.lower())


# 将所有的字母转换为大写字母, 除了缺失值
print(series1.str.upper())

# 分离
print(series1.str.split(":"))

# 去掉左右两端的某个字符
print(series1.str.strip('$'))

在这里插入图片描述
在这里插入图片描述

案例2_消费金额和小费之间的关联与性别和吸烟与否的关系

  • 文件名称: doc/tips.csv
  • 文件内容: 总消费金额, 小费金额, 性别, 是否抽烟, 日期, 时间, 星期
需求:
  • 分别吸烟顾客与不吸烟顾客的消费金额与小费之间的散点图;
  • 女性与男性中吸烟与不吸烟顾客的消费金额与小费之间的散点图关系;
# 分别吸烟顾客与不吸烟顾客的消费金额与小费之间的散点图;
import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
from pyecharts import EffectScatter
df=pd.read_csv('doc/tips.csv')
smoker=df[df.smoker=='Yes']
noSmoker=df[df.smoker=='No']
smoker_y=smoker.total_bill
smoker_x=smoker.tip
noSmoker_x=noSmoker.tip
noSmoker_y=noSmoker.total_bill
es=EffectScatter('消费金额于小费之间的关系')
es.add('吸烟者',smoker_x,smoker_y)
es.add('不吸烟者',noSmoker_x,noSmoker_y)
es.render()

在这里插入图片描述

# 女性与男性中吸烟与不吸烟顾客的消费金额与小费之间的散点图关系;
import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
from pyecharts import EffectScatter
df=pd.read_csv('doc/tips.csv')
male=df[df.sex=='Male']
female=df[df.sex=='Female']
male_smoker=male[male.smoker=='Yes']
male_noSmoker=male[male.smoker=='No']
male_smoker_x=male_smoker.tip
male_smoker_y=male_smoker.total_bill
male_noSmoker_x=male_noSmoker.tip
male_noSmoker_y=male_noSmoker.total_bill
female_smoker=female[female.smoker=='Yes']
female_noSmoker=female[female.smoker=='No']
female_smoker_x=female_smoker.tip
female_smoker_y=female_smoker.total_bill
female_noSmoker_x=female_noSmoker.tip
female_noSmoker_y=female_noSmoker.total_bill
es=EffectScatter('男女吸烟与不吸烟的消费金额和小费关系图')
es.add('男性吸烟',male_smoker_x,male_smoker_y)
es.add('男性不吸烟',male_noSmoker_x,male_noSmoker_y)
es.add('女性吸烟',female_smoker_x,female_smoker_y)
es.add('女性不吸烟',female_noSmoker_x,female_noSmoker_y)
es.render()

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值