python数据分析——pandas使用方法

Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。
pandas中常见的数据类型:
- 一维: Series
- 二维: DataFrame
- 三维: Panel …
- 四维: Panel4D …
- N维: PanelND …
但在Pandas 中的主要数据结构是 Series(一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。

利器之一:Series

类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。
Series是Pandas中的一维数据结构,类似于Python中的列表和Numpy中的Ndarray,不同之处在于:Series是一维的,能存储不同类型的数据,有一组索引与元素对应。
1、series的创建

import pandas as pd
import numpy as np
import string
# 查看pandas版本
print(pd.__version__)

# 1、通过列表,创建series对象
array = ['粉条', '粉丝', '粉带']
# 如果不指定索引默认从0开始
s1 = pd.Series(data=array)
print(s1)
# 指定索引
ss1 = pd.Series(data=array, index=['A', 'B', 'C'])
print(ss1)

# 2、通过numpy的对象Ndarray创建Series
n = np.random.randn(5)
print(n)
s2 = pd.Series(data=n)
print(s2)
print(s2.dtype)
# 修改元素的数据类型
ss2 = s2.astype(np.int)
print(ss2)

# 3、通过字典创建Series对象,字典的所有key值作为索引,所有的value值作为series值
# 字典生成式
dict = {string.ascii_lowercase[i]: i for i in range(10)}
print(dict)
s3 = pd.Series(dict)
print(s3)

Series基本操作
Series 基本操作:
编号 属性或方法 描述
1 axes 返回行轴标签列表。
2 dtype 返回对象的数据类型(dtype)。
3 empty 如果系列为空,则返回True。
4 ndim 返回底层数据的维数,默认定义:1。
5 size 返回基础数据中的元素数。
6 values 将系列作为ndarray返回。
7 head() 返回前n行。
8 tail() 返回最后n行。

import pandas as pd
import numpy as np
import string

array = ['1', 2, 3]
s1 = pd.Series(data=array)
print(s1)
print(s1.axes)  # [RangeIndex(start=0, stop=3, step=1)]
print(s1.dtype)
print(s1.empty)
print(s1.ndim)
print(s1.values)
print(s1.size)   # 元素的个数

# 1、修改Series的索引
print(s1.index)
s1.index = ['A', 'B', 'C']
print(s1)

# Series纵向拼接
array = ["粉条", "粉丝", "westos"]
# 如果不指定索引,默认从0开始
s2 = pd.Series(data=array)
s3 = s1.append(s2)
print(s3)

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

# 4、根据指定的索引查找元素
print(s3['B'])
s3['B'] = np.nan  # None, null, pandas数据为空, 或者数据缺失, np.nan
print(s3)

# 5、切片操作 ---与列表相同
print(s3[:2])   # 获取前2个元素
print(s3[::-1]) # 元素进行反转
print(s3[-2:])  # 显示最后两个元素

pandas中的where方法

import pandas as pd
import numpy as np
import string

# &**********series中的where方法运行结果和numpy中完全不同;
s1 = pd.Series(np.arange(5), index=['a', 'b', 'c', 'd', 'e'])
print(s1[s1>3])
print(type(s1))
# 判断s1的value值是否大于3, 如果大于3,值不变, 否则,设置为缺失值
print(s1.where(s1 > 3))

# 对象中不大于3的元素赋值为10;判断s1的value值是否大于3, 如果大于3,值不变, 否则,设置值为10
print(s1.where(s1 > 3, 10))

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

利器之二:DataFrame

DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
注意:Series只有行索引,而DataFrame对象既有行索引,也有列索引
行索引,表明不同行,横向索引,叫index,
列索引,表明不同列,纵向索引,叫columns,

DataFrame数据类型的创建
Series只有行索引,而DataFrame对象既有行索引,也有列索引
行索引,表明不同行,横向索引,叫index,
列索引,表明不同列,纵向索引,叫columns,

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
# 方法一:通过列表创建
li = [
    [1, 2, 3, 4],
    [2, 3., 4, 5]
]
# d0 = np.ndarray(li)  报错
# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
# d1 = pd.DataFrame(data=li, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
d1 = pd.DataFrame(data=li)
print(d1)
print(d1.dtypes)

# 方法二:通过numpy对象创建
narr = np.arange(8).reshape(2, 4)
d2 = pd.DataFrame(data=narr, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d2)

# 方法三:通过字典方式创建
dict = {
    'views': [1, 2, ],
    'loves': [2, 3, ],
    'comments': [3, 4, ]
}
d3 = pd.DataFrame(data=dict, index=['粉条', '粉丝'])
print(d3)

# 日期操作特例
# pd.date_range()
dates = pd.date_range(start='1/1/2020', end='1/08/2020', freq='2D')
print(dates)

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

# 一维对象:建立一个以2019年每一天作为索引, 值为随机数;
dates = pd.date_range(start='1/1/2021', end='1/3/2021', freq='D')
print(dates)
s1 = pd.Series([1, 2, 3], index=dates)
print(s1)

DataFrame基础属性和整体情况查询

a)基础属性
df.shape #行数、列数
df.dtype #列数据类型
df.ndim #数据维度
df.index #行索引
df.columns #列索引
df.values #对象值,二维ndarray数组
b)整体情况查询
df.head(3) #显示头部几行,默认5行
df.tail(3) #显示末尾几行,默认5行
df.info() #相关信息概览:行数、列数、索引、列非空值个数、列类型、内存占用
df.describe() #快速综合统计结果: 计数、均值、标准差、最大值、四分位数、最小值等

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

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(d2.dtypes)  # 列数据类型
print(d2.ndim)  # 获取数据的维度
print(d2.index)  # 行索引
print(d2.columns)  # 列索引
print(d2.values, type(d2.values))  # 对象的值, 二维ndarray数组;

# ******************************2). 数据整体状况的查询*************
print(d2.head(1))  # 显示头部的几行, 默认5行
print(d2.tail(1))  # 显示头部的尾行, 默认5行

print("*" * 10)
# 相关信息的预览: 行数, 列数, 列类型, 内存占用
print("info:", d2.info())

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

# 3). 转置操作
print("d2: \n", d2)
# print("d2 T: \n", d2.transpose())
print("d2 T: \n", d2.T)
# print("d2 T: \n", d2.swapaxes(1, 0))

# 4). 按列进行排序
print(d2)
# 按照指定列进行排序, 默认是升序, 如果需要降序显示,设置ascending=False;
print(d2.sort_values(by=["views", 'tranfers'], ascending=False))

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

# 6). 通过类似索引的方式查询;
#       - iloc(通过位置进行行数据的获取),
#        - loc(t通过标签索引行数据)
# print(d2[0])
# print(d2)
print(d2.iloc[0])
print(d2.iloc[-1])


# print(d2['A'])    # 报错
print(d2)
print(d2.loc['A'])

# 7). 更改pandas的值;
d2.loc['A'] = np.nan
print(d2)

print(d2.info())

pandas的csv文件的读写操作

import os

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# csv, excel, json........
# 1). csv文件的写入

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

print(df)

filename = os.path.join('doc', 'csvFile.csv')
"""
index=True/False   是否存储行索引, 一般情况下不存储
mode='w'           文件写入的方式, 默认是'w'(清空原有的文件内容, 再写入), 'a'追加
header=True/False  是否写入头部信息(列索引), 一般情况是需要的
"""
# df.to_csv(filename, index=False, mode='a', header=False, sep=' ')  # index=False不存储行索引
# print("csv文件保存成功")

# # 2). csv文件的读取
# df2 = pd.read_csv('doc/csvFile.csv')
# print(df2)

# 3). excel文件的写入
df.to_excel("doc\excelFile.xlsx", sheet_name="省份统计", index=False)
print("excel文件保存成功")

分组和聚合操作groupby
pandas提供了一个灵活高效的groupby功能,
1). 它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。
2). 根据一个或多个键(可以是函数、数组或DataFrame列>名)拆分pandas对象。
3). 计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

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

print(df)
# 根据某一列的key值进行统计分析;
grouped = df['count1'].groupby(df['province'])
print(grouped.describe())
print(grouped.median())

# 根据城市统计分析cpunt1的信息;
grouped = df['count1'].groupby(df['city'])
print(grouped.max())


# 指定多个key值进行分类聚合;
grouped = df['count1'].groupby([df['province'], df['city']])
print(grouped.max())
print(grouped.sum())
print(grouped.count())

#  通过unstack方法, 实现层次化的索引;
print(grouped.max().unstack())

pandas对于数据的处理

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

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

案例一:商品数据分析

"""
文件描述: 每列数据分别代表如下: 订单编号, 订单数量, 商品名称, 商品详细选择项, 商品总价格
需求1:
    1). 从文件中读取所有的数据;  如何读取csv文件? to_csv
    2). 获取数据中所有的商品名称;如何获取dataframe对象中的某一列信息? df['列名'], df.列名称
    3). 跟据商品的价格进行排序, 降序,   如何对df对象排序? d2.sort_values(by=["排序的列名称"], ascending=True)
    将价格最高的20件产品信息写入mosthighPrice.xlsx文件中;   如何获取df的前20行并写入文件? df.head(20)   df1.to_csv(xxxxxx)
需求2:
    1). 统计列[item_name]中每种商品出现的频率,绘制柱状图
            (购买次数最多的商品排名-绘制前5条记录)
    2). 根据列 [odrder_id] 分组,求出每个订单花费的总金额。
    3). 根据每笔订单的总金额和其商品的总数量画出散点图。
"""


import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# # 需求1:
# #     1). 从文件中读取所有的数据;
# #     2). 获取数据中所有的商品名称;
# goodsInfo = pd.read_csv('doc/chipo.csv')
# # print(goodsInfo.head())
# # print(goodsInfo.tail())
# # print(goodsInfo.info())
# # print(goodsInfo.describe())
# print("商品名称显示: \n", goodsInfo['item_name'].head())
# print("商品名称显示: \n", goodsInfo.item_name.head())
#
#
# #
# # 需求1:
# #
# #     3). 跟据商品的价格进行排序, 降序,
# #     将价格最高的20件产品信息写入mosthighPrice.xlsx文件中;
# # 重新赋值;
# goodsInfo.item_price = goodsInfo.item_price.str.strip('$').astype(np.float)
# highPriceData = goodsInfo.sort_values('item_price', ascending=False).head(20)
# # print(highPriceData.head(5))
# filename = 'doc\mostHighPrice.xlsx'
# highPriceData.to_excel(filename)
# print("保存成功.......")


#
# 需求2:
#     1). 统计列[item_name]中每种商品出现的频率,绘制柱状图
#             (购买次数最多的商品排名-绘制前5条记录)
goodsInfo = pd.read_csv('doc\chipo.csv')
# new_info会统计每个商品名出现的次数;其中 Unnamed: 0就是我们需要获取的商品出现频率;
newInfo = goodsInfo.groupby('item_name').count()
mostRaiseGoods = newInfo.sort_values('Unnamed: 0', ascending=False)['Unnamed: 0'].head(5)
print(mostRaiseGoods)       # Series对象


# 获取对象中的商品名称;
x = mostRaiseGoods.index
# 获取商品出现的次数;
y = mostRaiseGoods.values

# from pyecharts import Bar
#
# bar = Bar("购买次数最多的商品排名")
# bar.add("", x, y)
# bar.render()

案例二:消费金额与消费之间的关系

文件内容: 总消费金额, 小费金额, 性别, 是否抽烟, 日期, 时间, 星期
需求:
- 分别吸烟顾客与不吸烟顾客的消费金额与小费之间的散点图; #
- 女性与男性中吸烟与不吸烟顾客的消费金额与小费之间的散点图关系;

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

filename = 'doc/tips.csv'
data = pd.read_csv(filename)
print(data.head())
print(data.info())

# 实现吸烟顾客消费金额与小费之间的散点图
smoker = data[data['smoker'] == 'Yes']          # 筛选吸烟的顾客信息
x_total_bill1 = smoker['total_bill']
y_tip1 = smoker['tip']

# # 实现不吸烟顾客消费金额与小费之间的散点图
# no_smoker = data[data['smoker'] != 'Yes']
# # print(smoker.head())
# x_total_bill2 = no_smoker['total_bill']
# y_tip2 = no_smoker['tip']

# from pyecharts import  Scatter
# scatter = Scatter("吸烟/不吸烟顾客消费金额与小费之间的散点图")
# # 添加第1个数据信息: x和y
# scatter.add("吸烟", x_total_bill1, y_tip1)
# # 添加第2个数据信息: x和y
# scatter.add("不吸烟", x_total_bill2, y_tip2)
# scatter.render()

# # 女性中吸烟与不吸烟顾客的消费金额与小费之间的散点图关系;
is_smoker = data['smoker'] == 'Yes'
is_female = data['sex'] == 'Female'

female_smoker = data[is_female & is_smoker]
female_no_smoker = data[is_female & ~is_smoker]
male_smoker = data[~is_female & is_smoker]
male_no_smoker = data[~is_female & ~is_smoker]
#
# 3). 绘制散点图
from pyecharts import  Scatter
scatter = Scatter("消费金额与小费之间的散点图")
scatter.add("吸烟女顾客", female_smoker['total_bill'], female_smoker['tip'])
scatter.add("不吸烟女顾客", female_no_smoker['total_bill'], female_no_smoker['tip'])
scatter.add("吸烟男顾客", male_smoker['total_bill'], male_smoker['tip'])
scatter.add("不吸烟男顾客", male_no_smoker['total_bill'], male_no_smoker['tip'])

scatter.render()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值