Pandas使用(二)

6)Pandas画图

  1. pands.DataFrame.plot
  • DataFrame.plot(kind=‘line’)
    • kind : str,需要绘制图形的种类
      • line : line plot 折线图 默认的
      • bar:柱状图
      • barh:horizontal bar plot
      • hist :直方图
      • pie:饼图
      • scatter:散点图
2.pands.Series.plot

7)Pandas文件读取与存储

1.CSV

1.1 read_csv

  • pands.read_csv(filepath_or_buffer,sep=’,’)
    • filepath_or_buffer:文件的路径
    • usecols:指定读取的列名,列表形式

1.2 to _csv

  • DataFrame.to_csv(filepath_or_buffer,sep=’,’,columns=None,header=True,index=True,mode=‘w’,encoding=None)
    • filepath_or_buffer:文件路径
    • sep:分隔符,默认用’,'隔开
    • columns:选择需要保存的列索引
    • header:是否写进列索引,默认为True
    • index:是否写进行索引
    • mode=‘w’,重写 mode=‘a’ 追加数据
2.HDF5

2.1read_hdf 和to_hdf

HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame

  • pands.read_hdf(filepath_or_buffer,key,**kwargs)
    • filepath_or_buffer:文件路径
    • key:读取的键
    • return : Theselected object
  • DataFrame.to_hdf(filepath_or_buffer,key,**kwargs)
3.JSON

JSON是我们常用的一种数据交换格式,经常在前后端交互和存储的时候使用到这种数据格式。

Pandas也有自己的读取和存储JSON的格式!

3.1 read_json

  • pandas.read_json(filepath_or_buffer,orient,typ,lines)

    • 将JSON格式转换成默认的Pandas DataFrame格式

    • orient :str,数据的存储格式

        • ‘split’ : dict like {index -> [index], columns -> [columns], data -> [values]}

          • split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
        • ‘records’ : list like [{column -> value}, … , {column -> value}]

          • records 以columns:values的形式输出
        • ‘index’ : dict like {index -> {column -> value}}

          • index 以index:{columns:values}...的形式输出
        • ‘columns’ : dict like {column -> {index -> value}}

          ,默认该格式

          • colums 以columns:{index:values}的形式输出
        • ‘values’ : just the values array

          • values 直接输出值
    • lines : boolean, default False

      • 按照每行读取json对象
    • typ : default ‘frame’, 指定转换成的对象类型series或者dataframe

3.2 to_json

  • DataFrame.to_json(filepath_or_buffer,orient,lines)
    • 将pandas对象存储为json格式
    • filepath_or_buffer:文件路径
    • orient:存储的json格式{‘split’,‘records’,‘index’,‘columns’,‘values’}
    • lines:一个对象存储为一行

说明:

推荐使用HDF5文件存储

  • HDF5支持压缩
  • 节省空间
  • 支持跨平台

8)缺失值处理

1.如何处理nan
  • 如果缺失值的标记方式是NaN

    • 判断数据中是否包含NaN

    • pd.isnull(df)

      • pd.notnull(df)
    • 存在缺失值NaN,并且是np.NaN

      • 1.存在缺失值的: dropna(axis=‘rows’)

        注意:这个不会修改原数据,需要接受返回值

      • 2.替换缺失值:finllna(value,inplace=True)

    • vlaue:替换成的值

      • inplace : True 会修改原数据, False 会生成新对象
  • 如果缺失值没有用NaN标记,比如使用’?’

    • 先替换’?'为np.nan,然后再drapna(axis=‘rows’)
2.示例
# 读取数据
movie = pd.read_csv("movie.csv")

# 判断缺失值是否存在
movie.notnull().all()

# 存在缺失值NaN,并且缺失值的np.nan的处理方案
# 第一种方法.删除
data = movie.dropna()
# 第二种方法.替换
for i in movie.columns:
    if np.all(pd.notnull(movie[i])) == False:
        movie[i].fillna(movie[i].mean(),inplace=True)


# 存在默认标记的 如 '?'
# 先将'?'替换为np.nan
data = data.replace(to_replace='?',value=np.nan)
# 然后再删除np.nan
data.dropna()
        
  

9)数据离散化

1.为什么要进行离散化?

连续数据离散化的目的是为了简化数据结果,数据离散化技术可以用来减少给定连续属性值的个数。离散化的方法常作为数据挖掘的工具。

2.什么是数据的离散化?

连续数据的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。

3.分组工具
  • pd.quct(data,q):自动分组

    • 对数据进行分组,一般会与value_counts搭配使用,统计每组的个数
  • series.value_counts():统计分组次数

  • pd.cut(data,bins):自定义分组区间

4.示例
# 读取数据
data = pd.read_csv("stock_day.csv")
p_change = data['p_change']

# 自行分组
qcut = pd.qcut(p_change,10)
# 计算每个组的数据个数
qcut.value_counts()

# 自定义区间分组
bins = [-1,1,5,10,13,16,20]
p_counts = pd.cut(p_change,bins=bins)
5.将股票涨跌幅分组数据变成ont-hot编码

5.1什么是one-hot编码?

把每个类别生成一个布尔列,这些列中之后一列可以为这个样本取值为1,其又被称为热编码

  • pandas.get_dummies(data,prefis=None)
    • data:array-like,Series,DataFrame
    • prefix:分组名字(前缀名)
# 得出one-hot编码矩阵
dummies = pd.get_dummies(p_counts,prefix='test')

10)合并

1.pd.concat 实现数据合并
  • pd.concay([data1,data2],axis=1)
    • 按照行或列进行合并,axis=0为列索引,axis=1为行索引
# 按照行索引进行合并
pd.concat([data,dummies],axis=1)
2.pd.merge
  • pd.merge(lef,rigt,how=‘inner’,on=None)
    • 可以指定按照两组数据的共同键值对合并或者左右各自合并
    • left :DataFrame
    • right:另一个DataFrame
    • on:指定的共同键
    • how:按照什么方式连接

2.1 pd.merge 合并

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                        'key2': ['K0', 'K1', 'K0', 'K1'],
                        'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                        'key2': ['K0', 'K0', 'K0', 'K0'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']})


# 默认内连接合并
# 就是将left和right中共同有key1,key的数据合并起来,其他的不要
result = pd.merge(left,right,on=['key1','key2'])



# 左连接
# 就是以left表为主合并右表,左表数据全部显示,右表中跟随左边,没有的数据用NaN表示
result = pd.merge(left,right,how='left',on=['key1','key2'])

# 右连接
# 和左连接相反
result = pd.merge(left,right,how='right',on=['key1','key2'])

# 外连接
# 将left和right的所有数据连接起来,没有的数据用NaN表示
result = pd.merge(left,right,how='outer',on=['key1','key2'])

11)交叉表与透视表

1.交叉表与透视表有什么用?
  • 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
    • pd.crosstab(value1,value2)
  • 透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
    • data.pivor_table()
    • DataFrame.pivor_table([],index=[])
2.案例分析
  • 准备两列数据,星期数据以及涨跌幅是好是坏数据

  • 进行交叉表计算

    # 寻找星期几和股票涨幅的关系
    # 1.先把对应的日期找到星期几
    date = pd.to_datetime(data.index).weekday
    data['week'] = date
    
    # 2.假如把p_change按照大小去分个类0为界限
    data['posi_neg'] = np.where(data['p_change'] > 0 ,1, 0)
    
    # 通过交叉表找寻两列数据的关系
    count = pd.croesstab(data['week'],data['post_neg'])
    
    

    但是我们看到count只是每个星期日子的好坏天数,并没有得到比例,该怎么去做?

  • 对于每个星期的总天数求和,运用触发运算出比例

    # 算数运算,求和
    sum_ = count.sum(axis=1).astype(np.float32)
    
    # 进行相除,得出比例
    result = count.div(sum_,axis=0)
    
  • 使用plot画出柱状图,查看结果

    result.plot(kind='bar',stacker=True)
    plt.show()
    
  • 使用pivor_table(透视表)实现

    透视表会使刚才的过程更加简单

    data.pivot_table(['posi_neg'],index='week')
    

12)分组和聚合

1.1什么是分组和聚合?

分组和聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组请求。

pandas中抛开聚合谈分组无意义。

2.分组的API

  • DataFrame.groupby(key,as_index=False)
    • key:分组的列依据,可以是列表
  • 案例:不同颜色的不同笔的价格数据
col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})

# 数据结果如下:
color    object    price1    price2
0    white    pen    5.56    4.75
1    red    pencil    4.20    4.12
2    green    pencil    1.30    1.60
3    red    ashtray    0.56    0.75
4    green    pen    2.75    3.15

  • 进行分组,对颜色分组,price进行聚合
# 分组,求平均值
col.groupby(['color'])['price1'].mean()

# 结果
color
green    2.025
red      2.380
white    5.560
Name: price1, dtype: float64
        
# 分组,数据的结构不变
col.groupby(['color'],as_index=False)['price1'].mean()

# 结果
color    price1
0    green    2.025
1    red    2.380
2    white    5.560


13)小案例

问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?

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

df = pd.read_csv("movie.csv")

# 平均分
df['Rating'].mean()

# 导演人数
np.unique(df['Director']).shape[0]

问题2:对于这一组电影数据,如果我们想rating的分布情况,应该如何呈现数据?

# 1 直接展示
df['Rating'].plot(kind='hist',figsize=(20,8))

# 2 详细展示
plt.figure(figsize=(20,8),dpi=100)
plt.hist(df['Rating'],bins=20)
max_ = df['Rating'].max()
min_ = fd['Rating'].min()

plt.xticks(np.linspace(min_,max_,num=21))
plt.grid()
plt.show()

问题3:对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?

思路分析

  • 思路

    • 1、创建一个全为0的dataframe,列索引置为电影的分类,temp_df
    • 2、遍历每一部电影,temp_df中把分类出现的列的值置为1
    • 3、求和
  • 1.创建一个全是0的df,索引为电影分类

    # 进行字符串分割
    temp_list = [i.split(',') for i in df['Genre']]
    # 获取电影的分类
    genre_list = np.unique([j for i in temp_list for j in i])
    
    # 添加新的列
    temp_df = pd.DataFrame(np.zeros([df.shape[0],genre_list.shape[0]]),colums=genre_list)
    
    
    
  • 2.遍历每一部电影,将分类中出现的列置为1

    for i in range(1000):
        temp_df.ix[i,temp_list[i]] = 1
    
  • 3.求和 绘图

    temp_df.sum().sort_values(ascending=False).plot(kind='bar',figsize=(20,8),colormap='cool')
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值