Pandas
Pandas介绍
1.pandas是什么,为什么用?
2008年WesMcKinney开发出的库
专门用于数据挖掘的开源Python库
以Numpy为基础,借力Numpy模块在计算方面性能高的优势
基于matplotlib,能够简便的画图
独特的数据结构
为什么用?
数据处理能力强
读取文件方便
封装了Matplotlib、Numpy的画图和计算
核心数据结构
DataFrame:
结构:有行索引,列索引的二维数组,想获取某个数据时更简单
属性:shape,index,colums,values(直接获取其中array的值),T
方法:head(),tail() (返回前几行,返回后几行)
#添加行索引
y = ["行索引{}".format(i) for i in range(7)]
#添加列索引
x = ["列索引{}".format(i) for i in range(9)]
pd.DataFrame(data,index=y,columns=x)
设置索引
# 修改行列索引值
# data.index[2] = "新索引88" 不能单独修改索引
stock_ = ["新索引{}".format(i) for i in range(10)]
data.index = stock_
# 重设索引
data.reset_index(drop=False) # drop=True把之前的索引删除
# 设置新索引
df = pd.DataFrame({'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale':[55, 40, 84, 31]})
# 以月份设置新的索引
df.set_index("month", drop=True)
# 设置多个索引,以年和月份
new_df = df.set_index(["year", "month"])
Pannel
MultiIndex
多级或分层索引对象
index属性
names: levels的名称
levels: 每个level的元组值
Series
带索引的一维数组
属性
index
values
# 创建
pd.Series(np.arange(3, 9, 2), index=["a", "b", "c"])
# 或用字典区创建
pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
sr = data.iloc[1, :]
sr.index # 索引
基本操作
索引操作
data = pd.read_csv("路径名(.csv文件)") #读取数据
data = data.drop(["不要的列1","不要的列2","不要的列3","不要的列4"], axis=1) # 去掉一些不要的列
data["第一列"]["第一行"] # 直接索引,先列后行
data.loc["第一行"]["第一列"] # 按名字索引
data.loc["第一行", "第一列"]
data.iloc[1, 0] # 数字索引
# 组合索引
# 获取,['第一列', '第二列', '第三列', '第四列']这个四个指标的结果
data.iloc[:4, ['第一列', '第二列', '第三列', '第四列']] # 不能用了
data.loc[data.index[0:4], ['第一列', '第二列', '第三列', '第四列']]]
data.iloc[0:4, data.columns.get_indexer(['第一列', '第二列', '第三列', '第四列'])]
赋值操作
data.open = 100
data.iloc[1, 0] = 222
排序操作
1.对内容进行排序
使用df.sort_values(key=[“关键字1”,“关键字2”],ascending=)对内容进行排序
单个键或者多个键进行排序,默认升序
ascending=False:降序 True:升序
对索引进行排序
data.sort_index()
DataFrame运算
算数运算
data["第一列"].add(3).head() # 第一列统一加3 data["第一列"] + 3
data.sub(100).head() # 所有统一减100 data - 100
data["第二列"].sub(data["第一列"]).head() # 第二列减第一列
逻辑运算
< 、> 、| 、&
逻辑运算函数
query()
isin(关键字)
统计运算
describe()
画图
DataFrame.plot(x=None, y=None, kind=‘line’)
x: label or position
y: label, position or list of label, positions
kind: 图的类型
‘line’、'bar"、“barh”、“hist”“pie”、“scatter”
文件的读取和存储
读取CSV文件:
pd.read_csv("path", usecols=["第一列", "第二列", "第三列", "第四列"]).head() # 读哪些列
data = pd.read_csv("文件名", names=["第一列", "第二列", "第三列", "第四列"]) # 如果列没有列名,用names传入
data[:10].to_csv("test.csv", columns=["第一列"]) # 保存open列数据
data[:10].to_csv("test.csv", columns=["第一列"], index=False, mode="a", header=False) # 保存第一列数据,index=False不要行索引,mode="a"追加模式|mode="w"重写,header=False不要列索引
读取HDF5文件:
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame
read_hdf()
pandas.read_hdf(path_or_buf, key=None, **kwargs)
path_or_buffer: 文件路径
key: 读取的键
mode: 打开文件的模式
reurn: The Selected object
从h5文件当中读取数据
to_hdf()
DataFrame.to_hdf(path_or_buf, key, **kwargs)
day_close = pd.read_hdf("./stock_data/day/day_close.h5")
day_close.to_hdf("test.h5", key="close")
读取JSON文件:
read_json()
pandas.read_json(path_or_buf=None,orient=None,typ=“frame”,lines=False)
将JSON格式转换成默认的Pandas DataFrame格式
orient: string,Indication of expected JSON string format.
‘split’: dict like {index -> [index], columns -> [columns], data -> [values]}
‘records’: list like [{column -> value}, …, {column -> value}]
‘index’: dict like {index -> {column -> value}}
‘columns’: dict like {column -> {index -> value}}, 默认该格式
‘values’: just the values array
lines: boolean, default False
按照每行读取json对象
typ: default ‘frame’,指定转换成的对象类型series或者dataframe
sa = pd.read_json("Sarcasm_Headlines_Dataset.json", orient="records", lines=True)
sa.to_json("test.json", orient="records", lines=True)
缺失值处理
**如何 处理缺失值**
1、删除含有缺失值的样本
2、替换/插补数据
如何处理NaN?
判断是否有NaN:
pd.isnull(df) 或者 pd.notnull(df)
删除含有缺失值的样本:
df.dropna(inplace=True) 默认按行删除 inplace:True修改原数据,False返回新数据,默认False
替换/插补数据:
df.fillna(value,inplace=True) value替换的值 inplace:True修改原数据,False返回新数据,默认False
import pandas as pd
import numpy as np
movie = pd.read_csv("C:/virtual/IMDB-Movie-Data.csv")
# 1)判断是否存在NaN类型的缺失值
np.any(pd.isnull(movie)) # 返回True,说明数据中存在缺失值
#np.all(pd.notnull(movie)) # 返回False,说明数据中存在缺失值
import pandas as pd
import numpy as np
movie = pd.read_csv("C:/virtual/IMDB-Movie-Data.csv")
# 1)判断是否存在NaN类型的缺失值
pd.isnull(movie)
#pd.isnull(movie).any() #加了.any,返回某个字段是否有缺失值
# pd.notnull(movie).all()
import pandas as pd
import numpy as np
movie = pd.read_csv("./IMDB/IMDB-Movie-Data.csv")
# 1)判断是否存在NaN类型的缺失值
np.any(pd.isnull(movie)) # 返回True,说明数据中存在缺失值
np.all(pd.notnull(movie)) # 返回False,说明数据中存在缺失值
pd.isnull(movie).any()
pd.notnull(movie).all()
# 2)缺失值处理
# 方法1:删除含有缺失值的样本
data1 = movie.dropna()
pd.notnull(data1).all()
# 方法2:替换
# 含有缺失值的字段 Revenue (Millions), Metascore
# 求平均值填入
movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace=True)
movie["Metascore"].fillna(movie["Metascore"].mean(), inplace=True)
当缺失值不是NAN时
eg.把所有的?,替换成数据(或删除)
# 读取数据
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
name = ["Sample code number", "Clump Thickness", "Uniformity of Cell Size", "Uniformity of Cell Shape", "Marginal Adhesion", "Single Epithelial Cell Size", "Bare Nuclei", "Bland Chromatin", "Normal Nucleoli", "Mitoses", "Class"]
data = pd.read_csv(path, names=name)
# 1)替换
data_new = data.replace(to_replace="?", value=np.nan) #把?换成nan
# 2)删除缺失值
data_new.dropna(inplace=True)
数据离散化
什么是数据的离散化
连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间的属性值。
eg:
性别 年龄 男 女 年龄
A 1 21 l离散化 A 1 0 21
B 2 45 ——>l B 0 1 45
C 1 32 C 1 0 32
为什么要离散化
连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。
如何实现数据的离散化
1、分组
自动分组 sr = pd.qcut(data, bins)
自定义分组 sr = pd.cut(data, [])
2、将分组好的结果转换成one-hot编码(哑变量)
pd.get_dummies(sr, prefix=)
#1)准备数据
data = pd.Series([165,174,160,180,159,163,192,184], index=['No1:165', 'No2:174','No3:160', 'No4:180', 'No5:159', 'No6:163', 'No7:192', 'No8:184'])
# 2)分组
# 自动分组
sr = pd.qcut(data, 3) #分成三组
sr.value_counts() # 看每一组有几个数据
# 3)转换成one-hot编码
pd.get_dummies(sr, prefix="height")
# 自定义分组
bins = [150, 165, 180, 195]
sr = pd.cut(data, bins)
# get_dummies
pd.get_dummies(sr, prefix="身高")
(自动分组结果)
合并
按方向
pd.concat([data1, data2], axis=1) axis:0为列索引;1为行索引
按索引
pd.merge(left, right, how=“inner”, on=[]) on:索引
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']})
pd.merge(left, right, how="inner", on=["key1", "key2"]) #内连接
pd.merge(left, right, how="left", on=["key1", "key2"]) #
pd.merge(left, right, how="outer", on=["key1", "key2"])