pandas学习笔记

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"])

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天都要学习呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值