# -*- coding: UTF-8 -*-
'''
@Author :Jason
pandas 数据处理,在之前的数据结构基础上升级
'''
from pandas import DataFrame,Series
import pandas as pd
class DataProcessing(object):
def __init__(self):
self.data = {
"age":Series([18,85,64,85,85]),
"name":Series(["Jason","John","Jerry","John","John"])
}
def dataClean(self):
# 5.1 数据清洗:去重 + 缺失值处理
df = DataFrame(data=self.data)
print(df)
'''
age name
0 26 Jason
1 85 John
2 64 Jerry
3 85 John
4 85 John
'''
print(df.duplicated()) #False代表不重复,True 重复
'''
0 False
1 False
2 False
3 True
4 True
dtype: bool
'''
print(df.duplicated("name")) #name重复情况
'''
0 False
1 False
2 False
3 True
4 True
dtype: bool
'''
print(df.drop_duplicates("age")) #去除重复数据
'''
age name
0 18 Jason
1 85 John
2 64 Jerry
'''
#缺失值之前处理过,这里初略
'''
df.isnull() 缺失True,不缺失为False
df.notnull() 和上面相反
df.dropna() 去除缺失行,如果删除列的话,加参数axis=1,参数how="all",全却删除,any有缺就删除
df.fillna() 填充。df.fillna(value="",method="") value指定值替换缺失值,
method参数 pad,前一个替换,bfill,后一个替换,mean()平均值替换
df.fillna(df.mean()["填补列名":"计算均值的列名"]),
df.fillna({"列名1":值1,"列名2":"值2"}) 不同列不同填充
df["列或列"].str.strip() 去除空格,和字符用法一致
'''
# 5.2 数据抽取
def extractionData(self):
df = pd.read_excel("./FIle/lemon.xlsx",sheet_name="student")
name = df["name"].str.slice(0,1) #抽取名字中的姓,用法字符串切片....
# print(name) #0 黄 1 华 2 毛 Name: name, dtype: object
#5.2.1 重置索引 将name变为索引
df1 = DataFrame(self.data).set_index("name")
print(df1)
'''
age
name
Jason 18
John 85
Jerry 64
John 85
John 85
'''
#5.2.3 抽取name = "John"
print(df1.ix["John"])
'''
age
name
John 85
John 85
John 85
'''
# 5.3 插入记录
def insertData(self):
df = pd.DataFrame({
"a":[1,2,3],
"b":["a","b","c"],
"c":["A","B","C"]
})
line = pd.DataFrame({df.columns[0]:"--",df.columns[1]:"--",df.columns[2]:"--"},index=[1,2,3])
print(line)
#抽取df的index = 1,2,3的行赋值为 "--"
# 5.4 修改记录:单值替换 和 整行整列替换
def changeData(self):
df = DataFrame(self.data)
df2 = df.replace("Jason","ABC") #单值替换 为ABC
print(df2)
df3 = df.replace(["Jason","John"],["A","b"]) #A替换Jason,b替换John
df["age"] = [1,2,3,4,5]
print(df) #整列替换 为[1,2,3,4,5]
# 5.5 交换 行和列
def changeRowCol(self):
df = DataFrame(self.data)
print(df)
print(df.reindex([1,0,2,3,4])) # 1,2行互换,其他不换
# print(df.reindex(columns = ["name","age"])) #name 和 age列互换
# 5.6 排名索引
def sortIndex(self):
df0 = {"China":[9,7,10],"Japan":[6,8,7],"America":[9,5,8]}
df = DataFrame(df0,index=["a","c","d"])
# print(df.sort_index(ascending=False)) #默认index升序,False降序
# print(df.sort_index(by=["China","Japan"])) #by指定列,可以一列也可以多列,但是只有第一列生效
# 5.7 数据合并 append,concat 数组合并
#merge(df1,df2,left_on=index,right_on=index),类似于Excel中的VLOOKUP和sql的多表连接
def mergeData(self):
df1 = DataFrame(self.data)
df2 = DataFrame({
"name":[4,5,6,7],
"age":[1,2,3,4]
})
df = pd.concat([df1,df2],ignore_index=True)
# print(df) #合并起来,index自动顺延
# print(df1.append(df2,ignore_index=True))
df3 = df2["name"] + df2["age"]
# print(df3) #变成索引 + 5,7,9,11
df4 = DataFrame({
"name":["Jason","John"],
"age":[18,19]
})
df5 = DataFrame({
"name":["Jason","John"],
"Phone":[1234567,9897769]
})
df6 = pd.merge(df4,df5,left_on="name",right_on="name") #理解为左右连接
print(df6)
if __name__ == "__main__":
DP = DataProcessing()
DP.dataCalution()
简单计算是指通过对各宇段进行加、减、乘、除等四则算术运算,结果作为新的宇段。
# 简单计算
def dataCalution(self):
df1 = DataFrame({
"name": ["Jason", "John"],
"age": [18, 19],
"phone": [1234567, 9897769]
})
df1["age+phone"] = df1["age"].astype(int)+ df1["phone"].astype(int)
print(df1["age+phone"])
数据标准化 (归一化〉处理是数据分析和挖掘的一项基础工作,不同评价 指标往往具有不同 的 量纲和量纲单位,这样的情况会影 响到数据分析 的结果,为了消除指标之 间的 量纲影 响 ,需要进行数据标准化处 理 ,以 解决数据指标之 间的 可 比性。原始数据经过数据标准化处理后,各指标处于 同 一数量级,适合进行综合对 比 评价。
首先回答一个问 题:为什么要将数据标准化?
由于不同变量常常具有不同的单位和不同的变异程度。不同的单位常使系数的实践解释发生困难。例如,第 l 个变量的单位是峙,第 2 个变量的单位是 cm,那么在计算绝对距离时将出现两个问题 。第 1 个变量观察值之差 的绝对值 (单位是 kg )与第 2 个变量观察值之差的绝对值(单位是 cm )相加的情况,5kg 的 差异怎么可 以与 3cm 的 差异 相加?不同变量自身具有相 差较大的变异时,不同变量所占的 比重也大不相同。例如第 1 个变量的数值范围在 2%~4%之间,而第 2 个变量 的数值范围在 1000~5000 之间 。 为了消除量纲影 响和变量自身变异大小和数值大小的影响,故将数据标准化。数据标准化常用的方法为 :
( 1) min-max 标准化( Min-Max Normalization)
又名离差标准化,是对原始数据的线性转化,公式如下:
X*=(x-min)/(max-min)
其中, max 为样本最大值; min 为样本最小值。当有新数据加入时需要重新进行数据归一化。
代码实现
def standardData(self):
#1.min-max标准化(Min-Max Normalization)
df = pd.read_excel("./FIle/grade.xlsx")
# print(df.head())
'''
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训数分 高代 解几
0 0 2308024241 23080242 成龙 男 76 78 77 40 23 60
1 1 2308024244 23080242 周怡 女 66 91 75 47 47 44
2 2 2308024251 23080242 张波 男 85 81 75 45 45 60
3 3 2308024249 23080242 朱浩 男 65 50 80 72 62 71
4 4 2308024219 23080242 封印 女 73 88 92 61 47 46
'''
scale = (df.数分.astype(int) - df.数分.astype(int).min()) \
/(df.数分.astype(int).max()-df.数分.astype (int) .min())
print("数据标准化\n",scale)
'''
0 0.000000
1 0.184211
......
19 0.842105
Name: 数分, dtype: float64
'''
( 2) Z-score 标准化方法
Z-score 标准化方法适用于属性 A 的最大值和最小值未知的情况,或有超出 取值范围的离群数据的情况。这种方法给 予原始数据的均值( Mean )和标准差 ( Standard Deviation 〉进行数据的标准化。经过处理的数据符合标准正态分 布,即均值为 0 ,标准差为 l , 转化函数为: X*=(x-µ)/σ,
其中, μ 为所有样本数据的均值, σ 为所有样本数据的标准差。
将数据按其属性(按列进行)减去其均值,并除以其标准差,得到的结果 是,对于每个属性(每列)来说所有数 据都聚集在 0 附近,标准差为 1 。
使用 sklearn.preprocessing. scale()函数,可以直接将给定数据进行标准化:
#2.Z-score 标准化方法
from sklearn import preprocessing
import numpy as np
df = pd.read_excel("./FIle/grade.xlsx")
df1 = df["数分"]
df_scaled = preprocessing.scale(df1)
print(df_scaled)
'''
[-2.4465804 -1.69708093 -1.91122364 0.97970287 -0.198082 0.87263152
-0.198082 0.65848882 0.23020341 -0.30515335 -0.30515335 0.12313205
-0.198082 0.55141746 -0.198082 0.0160607 1.62213099 0.65848882
0.76556017 0.97970287]
'''
也可以使用 sklearn.preprocessing. S tandardSca !er 类,使用该类的好处在于 可以保存训练集中的参数 (均值、标准 差〉,直接使用其对象转换测试集数据:
X = np.array([[1,-1,2],[2,0,0],[0,1,-1]])
# print(X)
'''
[[ 1 -1 2]
[ 2 0 0]
[ 0 1 -1]]
'''
scaler = preprocessing.StandardScaler().fit(X) #StandardScaler(copy=True, with_mean=True, with_std=True)
# print(scaler.mean_) #[1. 0. 0.33333333]
# print(scaler.scale_) #[0.81649658 0.81649658 1.24721913]
# print(scaler.transform(X))
'''
[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
'''
print(scaler.transform([[-1.,1.,0.]])) #[[-2.44948974 1.22474487 -0.26726124]]
直白理解:新增一列,存储数据的特征(借助机器学习的特征工程和特征值最好理解),格式 cut(series,bins,right=True,labels=NULL)
# 5.9 数据分组
def dataGroup(self):
df = pd.read_excel('./File/grade.xlsx')
# print(df.shape) #(20,11)
bins = [min(df.解几)-1,69,70,80,max(df.解几)+1]
lab = ["不及格","及格","良好","优秀"]
newDf = pd.cut(df.解几,bins,right=False,labels=lab)
# print(newDf.head())
'''
0 不及格
1 不及格
2 不及格
3 良好
4 不及格
Name: 解几, dtype: category
Categories (4, object): [不及格 < 及格 < 良好 < 优秀]
'''
df["grade"] = newDf
print(df.head())
'''
Unnamed: 0 学号 班级 姓名 性别 英语 体育 军训 数分 高代 解几 grade
0 0 2308024241 23080242 成龙 男 76 78 77 40 23 60 不及格
1 1 2308024244 23080242 周怡 女 66 91 75 47 47 44 不及格
2 2 2308024251 23080242 张波 男 85 81 75 45 45 60 不及格
3 3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 良好
4 4 2308024219 23080242 封印 女 73 88 92 61 47 46 不及格
'''
def aboutTime(self):
from pandas import to_datetime
df = pd.read_csv("./File/time1.csv",encoding="utf-8")
# print(df)
'''
num price year month date
0 123 159 2016 1 2016/6/1
1 124 753 2016 2 2016/6/2
2 125 456 2016 3 2016/6/3
3 126 852 2016 4 2016/6/4
4 127 210 2016 5 2016/6/5
5 115 299 2016 6 2016/6/6
6 102 699 2016 7 2016/6/7
7 201 599 2016 8 2016/6/8
8 154 199 2016 9 2016/6/9
9 142 899 2016 10 2016/6/10
'''
df_dt = to_datetime(df["date"],format="%Y/%m/%d") #format格式啊
# print(df_dt)
'''
0 2016-06-01
1 2016-06-02
2 2016-06-03
3 2016-06-04
4 2016-06-05
5 2016-06-06
6 2016-06-07
7 2016-06-08
8 2016-06-09
9 2016-06-10
Name: date, dtype: datetime64[ns]
'''
print(df_dt.dt.year) #打印所有的年,
'''
0 2016
1 2016
2 2016
3 2016
4 2016
5 2016
6 2016
7 2016
8 2016
9 2016
Name: date, dtype: int64
'''
## 类似还有df_dt.dt.day,df_dt.dt.month,df_dtweekday,df_dt.dt.hour,df_dt.dt.second
参照:《基于Python的大数据分析基础及实战》