Python数据分析基础之Pandas(六) 数据计算-张柏沛IT博客

正文内容

Python数据分析基础之Pandas(六) 数据计算

栏目:Python 发布时间:2019-12-10 14:22 浏览量:286

本节继续介绍pandas的数据操作,这里介绍数据计算,包括数据的简单计算、数据标准化以及pandas中对日期的处理。最后做一个小实例为pandas做一个综合总结。


这里提供练习的文件:

链接:https://pan.baidu.com/s/1WEmunBN_Wo75EZd1cK6_lA 
提取码:3xco 

1.数据简单计算(加减乘除)

from pandas import read_csv

df1 = read_csv("../material/i_nuc_sheet3.csv")

jj=df1['解几'].astype(int)
gd = df1['高代'].astype(int)

df1['高代+解几']=jj+gd

print(df1)


2.数据标准化
离差标准化
X* = (x-min)/(max-min)

z-score标准化
X* = (x-u)/a

from pandas import read_csv

df1 = read_csv("../material/i_nuc_sheet3.csv")

#将数分标准化
print(df1['数分'])
#离差标准化
sf_max=df1['数分'].max()
sf_min = df1['数分'].min()
res1 = (df1['数分']-sf_min)/(sf_max-sf_min)

print(res1)


#z-score标准化  适用于最大值和最小值未知的情况
from sklearn import preprocessing
import numpy as np

sf=df1['数分']
res2 = preprocessing.scale(sf)
print(res2)

#z-score是给予原始数据的均值和标准差进行数据的标准化,得到的标准化结果符合正态分布(结果是正态分布中的X值)。


3.数据分组
cut(series,bins,right=True,labels=NULL)
series 需要分组的数据
bins 分组的依据
right 右边是否闭合,即如果80到90为良好,90到100算优秀,right=True,90算良好不算优秀
labels 自定义标签(类别)

from pandas import read_csv
import pandas as pd

df1 = read_csv("../material/i_nuc_sheet3.csv")

bins = [min(df1['解几'])-1,60,70,80,max(df1['解几'])+1]   #这里有5个数,4个区间,所以labels应该也有4个分类
labels = ["不及格","及格","良好","优秀"]
res = pd.cut(df1['解几'],bins,right=False,labels=labels)
print(res)

# 0      及格
# 1     不及格
# 2      及格
# 3      良好
# 4     不及格
# 5      良好
# 6      良好
# 7      及格
# 8      良好
# 9      良好
# 10     及格
# 11     良好
# 12     良好
# 13     良好
# 14     优秀
# 15     良好
# 16     良好
# 17     良好
# 18     良好
# 19     优秀
# 20     良好
# Name: 解几, dtype: category
# Categories (4, object): [不及格 < 及格 < 良好 < 优秀]

# 这个方法中有个坑,必须要先弄清楚最大值最小值,如果你设成 [min(df1['解几'])-1,60,70,80,90,max(df1['解几'])+1]但是,最大值就是84,90比max(df1['解几']+1)大,就会报错


4.日期处理
#字符串日期转为时间对象
to_datetime(series,format="%Y/%m/%d")

#时间抽取
df_dt.dt.year
df_dt.dt.month
df_dt.dt.day
df_dt.dt.second
df_dt.dt.hour
df_dt.dt.minute

这里介绍apply(lambda x:处理逻辑),相当于js中的map方法,里面传一个回调函数;apply是dataframe和series中的方法

apply(func,axis=0,args=0,**kwds)  axis=0按列计算;1是按行计算

from pandas import read_csv
from pandas import to_datetime

df1 = read_csv("../material/rz3.csv")

print(df1)

#字符串日期转为时间对象
df1_dt = to_datetime(df1['date'],format="%Y/%m/%d")
print(df1_dt)

#日期抽取,抽取年月日时分秒
print(df1_dt.dt.year)
print(df1_dt.dt.month)
print(df1_dt.dt.day)
print(df1_dt.dt.weekday)
print(df1_dt.dt.second)
print(df1_dt.dt.hour)

#将时间对象转为字符串
from datetime import datetime

df1_dt_str = df1_dt.apply(lambda x:datetime.strftime(x,"%Y年%m月%d日"))
print(df1_dt_str)


小案例:
material/rz.csv的成绩信息

1.求各科总成绩并按400以下,400到450,450以上分为一般,较好,优秀

2.将各科成绩标准化再汇总再分为 一般 较好 优秀


学号班级姓名性别英语体育军训数分高代解几
230802424123080242成龙767877402360
230802424423080242周怡669175474744
230802425123080242张波858175454560
230802424923080242朱浩655080726271
230802421923080242封印738892614746
230802420123080242迟培605089717671
230802434723080243李华676184616578
230802430723080243陈田767986694069
230802432623080243余皓666785656171
230802432023080243李嘉62作弊90606777
230802434223080243李上初769084606660
230802431023080243郭窦796784646479
230802443523080244姜毅涛7771缺考617376
230802443223080244赵宇747488687071
230802444623080244周路7680
617480
230802442123080244林建祥727281639075
230802443323080244李大强797677787070
230802442823080244李侧通649691696077
230802440223080244王慧737493707175
230802442223080244李晓亮856085727283
230802420123080242迟培605089717671


from pandas import DataFrame as df,read_csv
import pandas as pd

df1 = read_csv("../material/rz.csv")
print(df1.shape)

#查找重复行并去除
print(df1.duplicated())
df1 = df1.drop_duplicates()

#查看是否有空数据
print(df1.isnull())

#如果数据太多看不到空,可以查看有空数据的列
print(df1.isnull().any())

#空数据填充为0
df1 = df1.fillna(0)
print(df1)

#去除数据两边的空格
df1 = df1.astype(str).apply(lambda x:x.map(str.strip))   #df.apply中,x是series(每一列的series),series再用一次apply或者用map即可遍历到每一个单元格

#将作弊 缺考等字样用0替代
df1 = df1.replace({"作弊":0,"缺考":0})
print(df1)

#copy一份df1先
df2 = df1.copy()

#完成需求一:计算总成绩并分组
df1['总分']=df1['英语'].astype(int)+df1['体育'].astype(int)+df1['数分'].astype(int)+df1['军训'].astype(int)+df1['高代'].astype(int)+df1['解几'].astype(int)
print(df1)

labels=["一般","较好","优秀"]
bins=[min(df1['总分'])-1,400,450,max(df1['总分'])+1]
df1['等级']=pd.cut(df1['总分'],right=False,bins=bins,labels=labels)
print(df1)

#查看df的综合信息
print(df1.describe())

#完成需求二:标准化并分组;PS:必须先对每一科成绩标准化再对标准化的结果相加;而不能得到总分再对总分进行标准化
df_subject = df2.iloc[:,4:]     #获取所有科目的列组成的df(不包含学号,姓名这样的非分数的列)
print(df_subject)
df_subject = df_subject.astype(int)      #所有列转为整型,这样之后才能做标准化计算
df_subject_scale =df_subject.apply(lambda x:x.apply(lambda y:(y-x.min())/(x.max()-x.min())))  #求出每个单元格的标准化
print(df_subject_scale)

df2['scale_sum'] = df_subject_scale.apply(lambda x:x.sum(),axis=1)   #对所有科目的行求和

print(df2)
print(df2['scale_sum'].describe())

bins2 = [df2["scale_sum"].min()-1,3,4,df2["scale_sum"].max()+1]
df2['等级']=pd.cut(df2['scale_sum'],right=False,bins=bins2,labels=labels)
print(df2)


如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > Python数据分析基础之Pandas(六) 数据计算

热门推荐
推荐新闻