《大数据分析:基于Python》 课件 第7章 数据处理与分析_第1页
《大数据分析:基于Python》 课件 第7章 数据处理与分析_第2页
《大数据分析:基于Python》 课件 第7章 数据处理与分析_第3页
《大数据分析:基于Python》 课件 第7章 数据处理与分析_第4页
《大数据分析:基于Python》 课件 第7章 数据处理与分析_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大数据分析:基于Python

第7章

数据处理与分析余本国在数据分析过程中,据不完全统计,百分之七八十的工作量都是在做数据清洗,即数据处理成所需要的数据形式和格式。所以数据处理对于数据分析来说是至关重要的。只有当数据被正确地清洗和处理之后,才能确保分析结果的准确性和可靠性。如果数据中存在错误、重复、缺失或不一致的情况,那么分析结果可能会出现偏差,甚至误导决策。数据处理包括多个步骤,例如数据收集、数据清洗、数据转换和数据规范化等。其中,数据清洗是最耗费时间和精力的一步,因为它涉及到查找和修复数据中的错误和不一致,处理缺失值和重复数据,以及检查数据的格式和类型等。在数据清洗过程中,需要使用各种技术和工具,例如数据筛选、排序、查找和替换、正则表达式等,以确保数据的质量和可靠性。此外,还需要了解数据的来源和特点,以便更好地理解和处理数据。7.1数据预处理数据预处理包括对收集到的原始数据进行格式化、规范化、去重、去除噪声和异常值等操作。这个步骤中需要使用各种技术和算法,完成数据去重、修剪、替换、填充、归一化、缺失值处理等操作,以确保数据的质量和正确性。7.1.1异常值处理异常值处理包括重复值和缺失值以及离群点的处理,尤其对缺失值的处理要谨慎。当数据量较大时,并且在删除缺失值时不影响结论时,可以删除,当数据量较少时,删除后可能会影响数据分析的结果时,最好对缺失值进行填充。以下是一些常见的异常值处理方法。在处理异常值时,一定要考虑到数据的整体分布和业务背景,避免盲目处理导致数据失真或者误导分析结果。1.重复值处理重复值的处理是把数据结构中重复的行数据去除,仅保留重复值其中的一行。Python中的Pandas模块对重复数据去重步骤:(1)利用DataFrame中的duplicated()方法返回一个布尔型的Series,显示是否有重复行,没有重复行显示为FALSE,有重复行则从重复的第二行起,重复的行均显示为TRUE;(2)再利用DataFrame中的drop_duplicates()方法,用于返回一个移除了重复行的DataFrame。(3)使用df[df.a.duplicated()]显示重复值。如果仅仅是删除重复值,第一步用duplicated()返回布尔值可以省略。显示重复值duplicated()函数格式如下:duplicated(self,subset=None,keep='first')其中参数解释如下:subset:用于识别重复的列标签或列标签序列,默认所有列标签keep=‘frist’:除了第一次出现外,其余相同的被标记为重复keep='last':除了最后一次出现外,其余相同的被标记为重复keep=False:所有相同的都被标记为重复drop_duplicates():把数据结构中行相同的数据去除(仅保留重复行中的一行)。如果duplicated方法和drop_duplicates方法中没有设置参数,则这两个方法默认判断全部列;如果在这两个方法中加入了指定的属性名(列名),例如:frame.drop_duplicates(['state']),则指定部分属性(state列)进行重复项的判断。In[1]:frompandasimportDataFramefrompandasimportSeriesdf=DataFrame({'age':Series([26,85,64,85,85]),'name':Series(['Yubg','John’,'Jerry','Cd’,

'John'])})dfOut[1]:agename026Yubg185John264Jerry385Cd485JohnIn[2]:df.duplicated()#返回逻辑值,重复的行(第二次出现)显示TrueOut[2]:0False1False2False3False4Truedtype:bool

In[3]:df[df.duplicated()]#显示重复行Out[3]:agename485John

In[4]:df.duplicated('name')Out[4]:0False1False2False3False4Truedtype:boolIn[5]:df[~df.duplicated('name’)]

#先取反再取布尔值真,即删除name的重复行Out[5]:agename026Yubg185John264Jerry385Cd

In[6]:df.drop_duplicates('age’)#剔除age列中的重复行Out[6]:agename026Yubg185John264Jerry上面的df中索引为4的行属于索引为1的重复行,去重后重复行索引为4的行被删除。~表示取反,本例中所有为True的转为False,而False转化为True,再从布尔值里提取数据,即把为真的值提取出来,相当于对False(取反前为True的重复行)值删除。2.缺失值处理从统计上说,缺失的数据可能会产生有偏估计,从而使样本数据不能很好地代表总体,而现实中绝大部分数据都存在缺失值,因此如何处理缺失值很重要。一般说来,缺失值的处理包括两个步骤,即缺失数据的识别和缺失值处理。(1)缺失数据的识别pandas使用浮点值NaN表示浮点和非浮点数组里的缺失数据,并使用.isnull()和.notnull()函数来判断缺失情况。In[1]:frompandasimportDataFramefrompandasimportread_exceldf=read_excel(r'C:\Users\yubg\rz.xlsx',sheet_name='Sheet3')dfOut[1]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几0230802424123080242成龙

男767.87740.023.0601230802424423080242周怡

女669.17547.047.0442230802425123080242张波

男858.17545.045.060……8230802432623080243余皓

男666.78565.061.0719230802432023080243李嘉

女62作弊9060.067.07710230802420123080242迟培

男6058971.076.07111230802434223080243李上初

男7698460.066.06012230802431023080243郭窦

女796.78464.064.07913230802443523080244姜毅涛

男777.1缺考61.073.076……17230802443323080244李大强

男797.67778.0NaN7018230802442823080244李侧通

男649.69169.060.07719230802440223080244王慧

女737.49370.071.07520230802442223080244李晓亮

男8568572.072.083In[2]:df.isnull().tail()Out[2]:

学号

班级

姓名

性别

英语

体育

军训

数分

高代

解几16FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse17FalseFalseFalseFalseFalseFalseFalseFalseTrueFalse18FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse19FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse20FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse

In[3]:df.notnull()Out[3]:

学号

班级

姓名

性别

英语

体育

军训

数分

高代

解几0TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue1TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue2TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue…12TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue13TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue14TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue15TrueTrueTrueTrueTrueTrueTrueFalseTrueTrue16TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue17TrueTrueTrueTrueTrueTrueTrueTrueFalseTrue18TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue19TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue20TrueTrueTrueTrueTrueTrueTrueTrueTrueTrue对于某列要显示其空值所在的行,如“数分”列:df[df.数分.isnull()]要删除这个空值行,可以使用drop()函数,也可以使用:df[~df.数分.isnull()]~表示取反。(2)缺失数据的处理对于缺失数据的处理方式有数据填充、删除对应行、不处理等方法。1dropna():对数据结构中有值为空的行进行删除删除数据中有空值所对应的行。In[4]:newDF=df.dropna()newDFOut[4]:

学号

班级

姓名性别

英语体育

军训

数分高代

解几0230802424123080242成龙

男767.87740.023.0601230802424423080242周怡

女669.17547.047.0442230802425123080242张波

男858.17545.045.0603230802424923080242朱浩

男6558072.062.0714230802421923080242封印

女738.89261.047.0465230802420123080242迟培

男6058971.076.0716230802434723080243李华

女676.18461.065.0787230802430723080243陈田

男767.98669.040.0698230802432623080243余皓

男666.78565.061.0719230802432023080243李嘉

女62作弊9060.067.07710230802420123080242迟培

男6058971.076.07111230802434223080243李上初

男7698460.066.06012230802431023080243郭窦

女796.78464.064.07913230802443523080244姜毅涛

男777.1缺考61.073.07614230802443223080244赵宇

男747.48868.070.07116230802442123080244林建祥

男727.28163.090.07518230802442823080244李侧通

男649.69169.060.07719230802440223080244王慧

女737.49370.071.07520230802442223080244李晓亮

男8568572.072.083df中有NaN值的2、7行已经被删除。但可以指定参数how='all',表示只有行里的数据全部为空时才丢弃,如df.dropna(how='all')。如果想以同样的方式按列丢弃,可以传入axis=1,如df.dropna(how='all',axis=1)。2df.fillna():用其它数值填充NaN有时空值直接删除会影响分析的结果,可以对空值进行填补。如使用数值或者任意字符替代缺失值。In[5]:df.fillna('?')#用问号填充空值Out[5]:

学号

班级

姓名

性别

英语

体育军训数分

高代解几0230802424123080242成龙

男767.87740.023.0601230802424423080242周怡

女669.17547.047.0442230802425123080242张波

男858.17545.045.0603230802424923080242朱浩

男6558072.062.0714230802421923080242封印

女738.89261.047.0465230802420123080242迟培

男6058971.076.0716230802434723080243李华

女676.18461.065.0787230802430723080243陈田

男767.98669.040.0698230802432623080243余皓

男666.78565.061.0719230802432023080243李嘉

女62作弊9060.067.07710230802420123080242迟培

男6058971.076.07111230802434223080243李上初

男7698460.066.06012230802431023080243郭窦

女796.78464.064.07913230802443523080244姜毅涛

男777.1缺考61.073.07614230802443223080244赵宇

男747.48868.070.07115230802444623080244周路

女76877?74.08016230802442123080244林建祥

男727.28163.090.07517230802443323080244李大强

男797.67778.0?7018230802442823080244李侧通

男649.69169.060.07719230802440223080244王慧

女737.49370.071.07520230802442223080244李晓亮

男8568572.072.083如2、7行的空用“?”替代了缺失值。In[6]:df.fillna(method='pad')Out[6]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几0230802424123080242成龙

男767.87740.023.0601230802424423080242周怡

女669.17547.047.044……8230802432623080243余皓

男666.78565.061.0719230802432023080243李嘉

女62作弊9060.067.07710230802420123080242迟培

男6058971.076.07111230802434223080243李上初

男7698460.066.06012230802431023080243郭窦

女796.78464.064.07913230802443523080244姜毅涛

男777.1缺考61.073.07614230802443223080244赵宇

男747.48868.070.07115230802444623080244周路

女7687768.074.08016230802442123080244林建祥

男727.28163.090.07517230802443323080244李大强

男797.67778.090.07018230802442823080244李侧通

男649.69169.060.07719230802440223080244王慧

女737.49370.071.07520230802442223080244李晓亮

男8568572.072.083

3df.fillna(method='pad'):用前一个数据值替代NaN用前一个数据值替代当前的缺失值。4df.fillna(method='bfill'):用后一个数据值替代NaN与pad相反,bfill表示用后一个数据代替NaN。可以用limit限制每列可以替代NaN的数目。In[7]:df.fillna(method='bfill')Out[7]:

学号

班级

姓名性别

英语

体育

军训数分

高代

解几0230802424123080242成龙

男767.87740.023.0601230802424423080242周怡

女669.17547.047.0442230802425123080242张波

男858.17545.045.0603230802424923080242朱浩

男6558072.062.0714230802421923080242封印

女738.89261.047.0465230802420123080242迟培

男6058971.076.0716230802434723080243李华

女676.18461.065.0787230802430723080243陈田

男767.98669.040.0698230802432623080243余皓

男666.78565.061.0719230802432023080243李嘉

女62作弊9060.067.07710230802420123080242迟培

男6058971.076.07111230802434223080243李上初

男7698460.066.06012230802431023080243郭窦

女796.78464.064.07913230802443523080244姜毅涛

男777.1缺考61.073.07614230802443223080244赵宇

男747.48868.070.07115230802444623080244周路

女7687763.074.08016230802442123080244林建祥

男727.28163.090.07517230802443323080244李大强

男797.67778.060.07018230802442823080244李侧通

男649.69169.060.07719230802440223080244王慧

女737.49370.071.07520230802442223080244李晓亮

男8568572.072.0835df.fillna(df.mean()):用平均数或者其它描述性统计量来代替NaN使用均值来填补空数据。

In[8]:df.fillna(df["数分"].mean())Out[8]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几0230802424123080242成龙

男767.87740.0023.00601230802424423080242周怡

女669.17547.0047.00442230802425123080242张波

男858.17545.0045.0060…8230802432623080243余皓

男666.78565.0061.00719230802432023080243李嘉

女62作弊9060.0067.007710230802420123080242迟培

男6058971.0076.007111230802434223080243李上初

男7698460.0066.006012230802431023080243郭窦

女796.78464.0064.007913230802443523080244姜毅涛

男777.1缺考61.0073.007614230802443223080244赵宇

男747.48868.0070.007115230802444623080244周路

女7687763.3574.008016230802442123080244林建祥

男727.28163.0090.007517230802443323080244李大强

男797.67778.0063.357018230802442823080244李侧通

男649.69169.0060.007719230802440223080244王慧

女737.49370.0071.007520230802442223080244李晓亮

男8568572.0072.0083“数分”列中有一个空值,剩余的均值为63.35,故以63.35替代。6df.fillna({'列名1':值1,'列名2':值2}):可以传入一个字典,对不同的列填充不同的值为不同的列填充不同的值来填补空数据。In[10]:df.fillna({'数分':100,'高代':0})Out[10]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几0230802424123080242成龙

男767.87740.023.0601230802424423080242周怡

女669.17547.047.044…8230802432623080243余皓

男666.78565.061.0719230802432023080243李嘉

女62作弊9060.067.07710230802420123080242迟培

男6058971.076.07111230802434223080243李上初

男7698460.066.06012230802431023080243郭窦

女796.78464.064.07913230802443523080244姜毅涛

男777.1缺考61.073.07614230802443223080244赵宇

男747.48868.070.07115230802444623080244周路

女76877100.074.08016230802442123080244林建祥

男727.28163.090.07517230802443323080244李大强

男797.67778.00.07018230802442823080244李侧通

男649.69169.060.07719230802440223080244王慧

女737.49370.071.07520230802442223080244李晓亮

男8568572.072.083“数分”列填充值为100,“高代”列填充值为0。7strip():清除字符型数据左右(首尾)指定的字符,默认为空格删除字符串左右两侧或首尾指定的空格。In[11]:frompandasimportDataFrame...:frompandasimportSeries...:df=DataFrame({'age':Series([26,85,64,85,85]),...:'name':Series(['Ben’,...:'John','Jerry','John','John'])})...:dfOut[11]:agename026Ben185John264Jerry385John485John

In[12]:df['name'].str.strip()Out[12]:0Ben1John2Jerry3John4JohnName:name,dtype:object如果要删除右边的则df['name'].str.rstrip(),删除左边的df['name'].str.lstrip(),默认为删除空格,也可以带参数,如删除右边的“n”:In[13]:df['name'].str.rstrip('n')Out[13]:0Be1John2Jerry3John4JohName:name,dtype:object在做异常处理时,有些数据可能会出现数据格式不同,如成绩表中某列记录的是分数,应该是数值型的数据,但是其中有一行数据填写的是“缺考”或者“作弊”,这时候如果要对数据做均分计算就会出错。此时我们需要对数据做一个数据检测,包括对数据各行或者各列看看数据格式是否统一,如是否均为数据型或者字符型,又或者显示为object。In[1]:frompandasimportread_excel...:df=read_excel(r'd:\python\i_nuc.xlsx',sheet_name='Sheet3')

In[2]:df.loc[9:14]#显示索引号9到14行数据Out[2]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几9230802432023080243李嘉

女62作弊9060.067.07710230802420123080242迟培

男6058971.076.07111230802434223080243李上初

男7698460.066.06012230802431023080243郭窦

女796.78464.064.07913230802443523080244姜毅涛

男777.1缺考61.073.07614230802443223080244赵宇

男747.48868.070.071

In[3]:()#查看数据整体情况<class'pandas.core.frame.DataFrame'>RangeIndex:21entries,0to20Datacolumns(total10columns):#ColumnNon-NullCountDtype----------------------------0学号21non-nullint641班级21non-nullint642姓名21non-nullobject3性别21non-nullobject4英语21non-nullint645体育21non-nullobject6军训21non-nullobject7数分20non-nullfloat648高代20non-nullfloat649解几21non-nullint64dtypes:float64(2),int64(4),object(4)memoryusage:1.8+KB7.1.2数据标准化在数据分析之前,有些数据我们通常需要先将其标准化hormalization),利用标准化后的数据进行分析。数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。数据标准化的方法有很多种,常用的有“最小-大标准化”、“Z-score标准化”和“按小数定标标准化”等。经过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,可以进行综合测评分析。1.min-max标准化min-max标准化(Min-maxnormalization),又名离差标准化,是对原始数据的线性变换,使结果映射到[0,1]区间且无量纲。公式如下:X*=(x-min)/(max-min)max:样本最大值;min:样本最小值。当有新数据加入时需要重新进行数据归一化。In[1]:frompandasimportread_excel...:df=read_excel(r'C:\Users\yubg\i_nuc.xls',sheetname='Sheet7’)...:df.head()Out[1]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几0230802424123080242成龙

男7678774023601230802424423080242周怡

女6691754747442230802425123080242张波

男8581754545603230802424923080242朱浩

男6550807262714230802421923080242封印

女738892614746

In[2]:scale=(df.数分.astype(int)-df.数分.astype(int).min())/(...:df.数分.astype(int).max()-df.数分.astype(int).min())...:scale.head()Out[2]:00.00000010.18421120.13157930.84210540.552632Name:数分,dtype:float64

2.Z-score标准化方法这种方法给予原始数据的均值(mean)和标准差(standarddeviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:X*=(x-μ)/σ其中μ为所有样本数据的均值,σ为所有样本数据的标准差。将数据按其属性(按列进行)减去其均值,并除以其标准差。得到的结果是,对于每个属性(每列)来说所有数据都聚集在0附近,标准差为1。z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化:In[3]:fromsklearnimportpreprocessing...:importnumpyasnp

...:df1=df['数分']...:df_scaled=preprocessing.scale(df1)...:df_scaledOut[3]:array([-2.50457384,-1.75012229,-1.96567988,0.94434751,-0.2412192,0.83656872,-0.2412192,0.62101114,0.18989597,-0.34899799,-0.34899799,0.08211717,-0.2412192,0.51323234,-0.2412192,-0.02566162,1.59102027,0.62101114,0.72878993,0.94434751,0.83656872])7.1.3数据运算通过对各字段进行加、减、乘、除等四则算术运算,计算出的结果作为新的字段,如表7-1所示。表7-1字段之间的运算结果作为新的字段In[1]:frompandasimportread_excel...:df=read_excel(r'c:\Users\yubg\i_nuc.xls',sheetname='Sheet7’)...:df.head()Out[1]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几0230802424123080242成龙

男7678774023601230802424423080242周怡

女6691754747442230802425123080242张波

男8581754545603230802424923080242朱浩

男6550807262714230802421923080242封印

女738892614746In[1]:jj=df['解几'].astype(int)#将df中的“解几”转化为int类型...:gd=df['高代'].astype(int)

...:df['数分+解几']=jj+gd#在df中新增“数分+解几”列,值为:jj+gd...:df.head()Out[112]:

学号

班级

姓名性别

英语

体育

军训

数分

高代

解几

数分+解几0230802424123080242成龙

男767877402360831230802424423080242周怡

女669175474744912230802425123080242张波

男8581754545601053230802424923080242朱浩

男6550807262711334230802421923080242封印

女73889261474693对列的数据类型进行转化也可以使用map()和apply()。jj=df['解几'].map(str)#将df中的“解几”转化为str类型gd=df['高代'].apply(float)#将df中的“高代”转化为float类型7.1.4日期处理数据处理时常常会遇到对日期时间格式进行处理,以及对时间进行运算等。1.日期转换将字符型的日期格式转换为日期格式数据的过程。to_datetime(dateString,format) format格式:%Y:年份%m:月份%d:日期%H:小时%M:分钟%S:秒如to_datetime(df.注册时间,format=’%Y/%m/%d’)。In[1]:frompandasimportto_datetime...:frompandasimportread_excel...:df=read_excel(r'd:\OneDrive\i_nuc.xlsx',sheet_name='Sheet9')...:dfOut[1]:numpriceyearmonthdate0123159201612016-06-011124753201622016-06-022125456201632016-06-033126852201642016-06-044127210201652016-06-055115299201662016-06-066102699201672016-06-077201599201682016-06-088154199201692016-06-0991428992016102016-06-10In[2]:df_dt=to_datetime(df.date,format="%Y/%m/%d")...:df_dtOut[2]:02016-06-0112016-06-0222016-06-0332016-06-0442016-06-0552016-06-0662016-06-0772016-06-0882016-06-0992016-06-10Name:date,dtype:datetime64[ns]2.日期格式化将日期型的数据按照给定的格式转化为字符型的数据。datetime.strftime(x,format)如日期型数据转化为字符型数据。In[1]:frompandasimportread_excel...:frompandasimportto_datetime...:fromdatetimeimportdatetime

In[2]:df_dt_str=df_dt.apply(lambdax:datetime.strftime(x,"%Y/%m/%d"))...:df_dt_strOut[2]:02016/06/0112016/06/0222016/06/0332016/06/0442016/06/0552016/06/0662016/06/0772016/06/0882016/06/0992016/06/10Name:date,dtype:object注意:当希望将函数f应用到数据框对象的行或列时,可以使用.apply(f,axis=0,args=(),**kwds)方法,axis=0表示按列运算,axis=1时表示按行运算。如:In[3]:frompandasimportDataFrame...:df=DataFrame({'ohio':[1,3,6],'texas':[1,4,5],'calif':[2,5,8]},index=['a','c','d'])...:dfOut[3]:ohiotexascalifa112c345d658

In[4]:f=lambdax:x.max()-x.min()...:df.apply(f)#默认按列运算,同df.apply(f,axis=0)Out[4]:ohio5texas4calif6dtype:int64

In[5]:df.apply(f,axis=1)#按行运算Out[5]:a1c2d3dtype:int643.日期抽取是指从日期格式里面抽取出需要的部分属性。Data_pertysecond1-60秒,从1开始到60minute1-60分,从1开始到60hour1-24小时,从1开始到24day1-31日,一个月中第几天,从1开始到31month1-12月,从1开始到12year年份weekday1-7,一周中的第几天,从1开始,最大为7如对日期进行抽取。In[6]:df_dt.dt.yearOut[6]:02016120162201632016420165201662016720168201692016Name:date,dtype:int32In[7]:df_dt.dt.dayOut[7]:011223344556677889910Name:date,dtype:int32其他的时间格式提取:df_dt.dt.monthdf_dt.dt.weekdaydf_dt.dt.seconddf_dt.dt.hour4.日期运算datetime模块下有timedelta()函数,可以在日期上进行加减,如在当前的日期上加上3天,函数会自动给出3天后的日期。In[8]:importdatetime...:[datetime.datetime.strftime(i+datetime.timedelta(3),"%Y/%m/%d")foriindf_dt]#在当天的天数上边加上3天.Out[8]:['2016/06/04','2016/06/05','2016/06/06','2016/06/07','2016/06/08','2016/06/09','2016/06/10','2016/06/11','2016/06/12','2016/06/13']In[9]:importdatetime...:t=[]...:foriindf_dt:...:d=i+datetime.timedelta(3)...:dd=datetime.datetime.strftime(d,"%Y/%m/%d")...:t.append(dd)...:tOut[9]:['2016/06/04','2016/06/05','2016/06/06','2016/06/07','2016/06/08','2016/06/09','2016/06/10','2016/06/11','2016/06/12','2016/06/13']这里用到了列表推导式,也可以分步实现。7.1.5其他操作1、map、apply的使用

将数据框中性别列对应的男女替换成1和0,并做成新的列。In[1]:importpandasaspd...:d={"gender":["male","female","male","female"],...:"color":["red","green","blue","green"],...:"age":[25,30,15,32]}...:...:df=pd.DataFrame(d)...:dfOut[1]:gendercolorage0malered251femalegreen302maleblue153femalegreen32In[2]:d={"male":0,"female":1}

...:df["gender2"]=df["gender"].map(d)

In[3]:dfOut[3]:gendercoloragegender20malered2501femalegreen3012maleblue1503femalegreen321在gender列上,使用map方法,快速完成如下映射:上面的操作也可以通过apply来实现。In[4]:df["mal_n"]=df.gender.apply(lambdax:1ifx=="male"else0)

...:dfOut[4]:gendercoloragemal_n0malered2511femalegreen3002maleblue1513femalegreen320还也可以写成以下的函数:defpd_column_modify_value(df,col,dic):"""

对某列的某个值进行统一修改。

对df数据的col列按照字典dic进行对应替换值"""df["name_"]=[""]*len(df)df["name_"]=df[col].map(dic)returndfIn[5]:importpandasaspd...:importnumpyasnp...:defpd_column_modify_value(df,col,dic):...:"""...:对某列的某个值进行统一修改。...:对df数据的col列按照字典dic进行对应替换值...:"""...:df["name_"]=[""]*len(df)...:df["name_"]=df[col].map(dic)...:returndfIn[6]:df=pd.DataFrame(np.random.randint(1,10,size=(5,2)),columns=['A','B'])...:dfOut[6]:AB035177244312444

In[7]:nw={5:0,2:"?"}...:pd_column_modify_value(df,"B",nw)Out[7]:ABname_0350177NaN244NaN312?444NaN2、replace和正则清洗数据在某列上使用replace方法和正则,快速完成值的清洗。先创建个数据框df。In[8]:d={"customer":["A","B","C","D"],

...:"sales":[1100,"950.5RMB","$400","$1250.75"]}...:...:df=pd.DataFrame(d)...:dfOut[8]:customersales0A 11001B 950.5RMB2C $4003D $1250.75目标是清洗掉RMB、$符号,转化这一列为浮点型。使用正则替换,将要替换的字符放到列表中[$,RMB],替换为空字符,即"";最后使用astype转为float。使用正则表达式时记得后面加regex=True参数,表示使用正则表达式。In[9]:df["sales"]=df["sales"].replace("[$,RMB]","",regex=True).astype("float")

In[10]:dfOut[10]:customersales0A1100.001B950.502C400.003D1250.75

3、将分类中出现次数较少的值归为others先创建一个数据库d。In[11]:d={"name":['Jone','Alica','Emily','Robert','Tomas',

...:'Zhang','Liu','Wang','Jack','Wsx','Guo'],

...:"categories":["A","C","A","D","A",

...:"B","B","C","A","E","F"]}

...:df=pd.DataFrame(d)

...:dfOut[11]:namecategories0JoneA1AlicaC2EmilyA3RobertD4TomasA5ZhangB6LiuB7WangC8JackA9WsxE10GuoFd中的D、E、F仅在分类中出现一次,A出现次数较多,将D、E、F归为other类。In[12]:frequencies=df["categories"].value_counts(normalize=True)

...:frequenciesOut[12]:A0.363636C0.181818B0.181818E0.090909D0.090909F0.090909Name:categories,dtype:float64步骤1:统计频次,并归一In[13]:threshold=0.1

...:small_categories=frequencies[frequencies<threshold].index

...:small_categoriesOut[13]:Index(['E','D','F'],dtype='object')步骤2:设定阈值,过滤出频次较少的值In[14]:df["categories"]=df["categories"].replace(small_categories,"Others")

In[15]:df["categories"]Out[15]:0A1C2A3Others4A5B6B7C8A9Others10OthersName:categories,dtype:object步骤3:替换值也可以对out[12]的结果frequencies做另外一种有意思的操作:低于0.1的则取0.18,高于0.2的则取0.2。defget_value(value,max_value,min_value):ifvalue>max_value:value=max_valueifvalue<min_value:value=min_valuereturnvalue

frequencies.apply(get_value,args=(0.2,0.18))思路如下:先自定义一个函数判断函数的值是否符合上述的规则;再将这个自定义函数应用到这个一列上去。7.2数据分析数据分析离不开Python的Numpy、Pandas和Scipy等常用分析工具,并结合常用的统计量来进行数据的描述,把数据的特征和内在结构展现出来。7.2.1基本统计基本统计分析又叫描述性统计分析。一般统计某个变量的最小值、第一个四分位值、中值、第三个四分位值、最大值和均值。描述性统计分析函数为describe()。其返回值是均值、标准差、最大值、最小值、分位数等。括号中可以带一些参数,例如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论