作者 | 俊欣
来源 |关于数据分析与可视化
今天小编来分享在pandas
当中经常会被用到的方法,篇幅可能有点长但是提供的都是干货,读者朋友们看完之后也可以点赞收藏,相信会对大家有所帮助,大致本文会讲述这些内容
DataFrame初印象
读取表格型数据
筛选出特定的行
用pandas
来绘图
在DataFrame中新增行与列
DataFrame中的统计分析与计算
DataFrame中排序问题
合并多个表格
时序问题的处理
字符串类型数据的处理
DataFrame初印象
我们先来通过Python
当中的字典类型来创建一个DataFrame,
importpandasaspddata={"Country":["Canada","USA","UK"],"Population":[10.52*10**6,350.1*10**6,65.2*10**6]}df=pd.DataFrame(data)df
当你通过Python
当中的字典来创建DataFrame,字典当中的keys
会被当做是列名,而values
则是表格当中的值
CountryPopulation0Canada10520000.01USA350100000.02UK65200000.0
要是我们要获取当中的某一列,我们可以这么来做
df["Country"]
output
0Portugal1USA2FranceName:Country,dtype:object
而当我们想要获取表格当中每一列的数据格式的时候,可以这么做
df.dtypes
output
CountryobjectPopulationfloat64dtype:object
读取数据
Pandas
当中有特定的模块可以来读取数据,要是读取的文件是csv
格式,我们可以这么来做
importpandasaspddf=pd.read_csv("titanic.csv")
我们要是想要查看表格的前面几行,可以这么做
df.head(7)
output
PassengerIdSurvivedPclass...FareCabinEmbarked0103...7.2500NaNS1211...71.2833C85C2313...7.9250NaNS3411...53.1000C123S4503...8.0500NaNS5603...8.4583NaNQ6701...51.8625E46S
这里我们只是展示了前面7行的数据,当然我们也可以使用tail()
方法来展示末尾的若干行的数据
df.tail(7)
output
PassengerIdSurvivedPclass...FareCabinEmbarked88488503...7.050NaNS88588603...29.125NaNQ88688702...13.000NaNS88788811...30.000B42S88888903...23.450NaNS88989011...30.000C148C89089103...7.750NaNQ
要是遇到文件的格式是excel
格式,pandas
当中也有相对应的方法
df=pd.read_excel("titanic.xlsx")
可以通过pandas
当中的info()
方法来获取对表格数据的一个初步的印象
df.info()
output
<class'pandas.core.frame.DataFrame'>RangeIndex:891entries,0to890Datacolumns(total12columns):#ColumnNon-NullCountDtype----------------------------0PassengerId891non-nullint641Survived891non-nullint642Pclass891non-nullint643Name891non-nullobject4Sex891non-nullobject5Age714non-nullfloat646SibSp891non-nullint647Parch891non-nullint648Ticket891non-nullobject9Fare891non-nullfloat6410Cabin204non-nullobject11Embarked889non-nullobjectdtypes:float64(2),int64(5),object(5)memoryusage:83.7+KB
我们可以从上面的信息中看到例如哪些列可能存在一些空值,每一列的数据类型,占用内存的情况等等。
筛选出特定条件的行
要是我们想要筛选出年龄在30岁以上的乘客,我们可以这么来操作
df[df["Age"]>30]
output
PassengerIdSurvivedPclass...FareCabinEmbarked1211...71.2833C85C3411...53.1000C123S4503...8.0500NaNS6701...51.8625E46S111211...26.5500C103S.......................87387403...9.0000NaNS87988011...83.1583C50C88188203...7.8958NaNS88588603...29.1250NaNQ89089103...7.7500NaNQ[305rowsx12columns]
当然我们也可以将若干个条件合起来,一同做筛选,例如
survived_under_45=df[(df["Survived"]==1)&(df["Age"]<45)]survived_under_45
output
PassengerIdSurvivedPclass...FareCabinEmbarked1211...71.2833C85C2313...7.9250NaNS3411...53.1000C123S8913...11.1333NaNS91012...30.0708NaNC.......................87487512...24.0000NaNC87587613...7.2250NaNC88088112...26.0000NaNS88788811...30.0000B42S88989011...30.0000C148C[247rowsx12columns]
这里我们通过&
也就是and
的表达方式来将两个条件组合到一起,表示要将上述两个条件都满足的数据给筛选出来。当然我们在上文也提到,数据集中有部分的列存在空值,我们可以以此来筛选行与列
df[df["Age"].notna()]
output
PassengerIdSurvivedPclass...FareCabinEmbarked0103...7.2500NaNS1211...71.2833C85C2313...7.9250NaNS3411...53.1000C123S4503...8.0500NaNS.......................88588603...29.1250NaNQ88688702...13.0000NaNS88788811...30.0000B42S88989011...30.0000C148C89089103...7.7500NaNQ[714rowsx12columns]
上面的操作简单来说就是筛选出“Age”不是空值的行,除此之外,我们还可以通过isin
方法来进行筛选,
df[df["Pclass"].isin([1,2])]
output
PassengerIdSurvivedPclass...FareCabinEmbarked1211...71.2833C85C3411...53.1000C123S6701...51.8625E46S91012...30.0708NaNC111211...26.5500C103S.......................88088112...26.0000NaNS88388402...10.5000NaNS88688702...13.0000NaNS88788811...30.0000B42S88989011...30.0000C148C[400rowsx12columns]
上述的代码简单说来就是满足“Pclass”当中是“1”和“2”值的那些部分给挑选出来,上述的代码等同于是
df[(df["Pclass"]==1)|(df["Pclass"]==2)]
筛选出特定条件的行与列
要是我们想要筛选出年龄大于40岁的乘客,同时想要得知他们的姓名,可以这么来操作
df.loc[df["Age"]>40,"Name"]
output
6McCarthy,Mr.TimothyJ11Bonnell,Miss.Elizabeth15Hewlett,Mrs.(MaryDKingcome)33Wheadon,Mr.EdwardH35Holverson,Mr.AlexanderOskar...862Swift,Mrs.FrederickJoel(MargaretWellesBa...865Bystrom,Mrs.(Karolina)871Beckwith,Mrs.RichardLeonard(SallieMonypeny)873VanderCruyssen,Mr.Victor879Potter,Mrs.ThomasJr(LilyAlexeniaWilson)Name:Name,Length:150,dtype:object
当我们使用loc\iloc
来筛选出部分数据的时候,[]中的第一部分代表的是“行”,例如df["Age"] > 40
,而[]中的第二部分代表的是“列”,例如Name
,你可以选择只要一列,也可以选择需要多列,用括号括起来即可
df.loc[df["Age"]>40,["Name","Sex"]]
如果我们将逗号后面的部分直接用:
来代替,则意味着要所有的列
df.loc[df["Age"]>40,:]
output
PassengerIdSurvivedPclass...FareCabinEmbarked6701...51.8625E46S111211...26.5500C103S151612...16.0000NaNS333402...10.5000NaNS353601...52.0000NaNS.......................86286311...25.9292D17S86586612...13.0000NaNS87187211...52.5542D35S87387403...9.0000NaNS87988011...83.1583C50C[150rowsx12columns]
我们也可以使用iloc
来进行筛选,只是与上面loc
不同的在于,这里我们要填的是索引,例如我们想要前面的0-3列以及0-9行的内容,
df.iloc[0:10,0:3]
output
PassengerIdSurvivedPclass01031211231334114503560367017803891391012
用Pandas来画图
我们还可以用Pandas来画图,而且实际用到的代码量还比较的少
df.plot()
output
要是你想要单独某一列的趋势图,我们也可以这么做
df["Age"].plot()
output
要是我们想要不同年龄对于船票费“Fare”的影响,画图可以这么来画
df.plot.scatter(x="Age",y="Fare",alpha=0.6)
output
除了散点图以及折线图之外,还有其他很多类型的图,具体我们可以这么来知晓
formethod_nameindir(df.plot):ifnotmethod_name.startswith("_"):print(method_name)
output
areabarbarhboxdensityhexbinhistkdelinepiescatter
我们看到还有直方图、饼图、水平方向的直方图等等,我们随便挑选一个类型的
df.plot.box()
output
要是我们希望可以分开来绘制图形,就可以这么来操作
df.plot.area(figsize=(12,4),subplots=True)
output
要是我们想要将绘制好的图片保存下来,可以直接使用savefig
方法,
importmatplotlib.pyplotaspltfig,axs=plt.subplots(figsize=(12,4))df.plot.area(ax=axs)fig.savefig("test.png")
output
由于篇幅有限,关于如何使用Pandas内部方法来绘制图形,就先介绍到这里,大家要是有兴趣,小编可以之后单独写一篇详细说说
如何新增一列
在DataFrame当中新增一列其实不难,我们可以这么来操作
df["Date"]=pd.date_range("1912-04-02",periods=len(df))df.head()
output
PassengerIdSurvivedPclass...CabinEmbarkedDate0103...NaNS1912-04-021211...C85C1912-04-032313...NaNS1912-04-043411...C123S1912-04-054503...NaNS1912-04-06[5rowsx13columns]
添加了新的一列叫做“Date”,长度为表格的总行数,那要是我们想要在原有表格的基础之上再添加一列呢?我们先来定义一个函数
defdefine_age(age):ifage<18:return"少年"elifage>=18andage<35:return"青年"elifage>=35andage<55:return"中年"else:return"老年"
然后再用apply
来实现
df["Generation"]=df["Age"].apply(define_age)df.head()
output
PassengerIdSurvivedPclass...CabinEmbarkedGeneration0103...NaNS青年1211...C85C中年2313...NaNS青年3411...C123S中年4503...NaNS中年[5rowsx13columns]
如果我们想给表格中的列名重新命名的话,可以使用rename
方法,
df_renamed=df.rename(columns={"Name":"FullName","Sex":"Gender","Ticket":"FareTicket"})df_renamed.head()
output
DataFrame中的统计分析
在Pandas
中也提供了很多相关的方法来进行数据的统计分析
print(df["Age"].mean())print(df["Age"].max())print(df["Age"].min())print(df["Age"].median())
上面分别计算了“Age”这一列的平均值、最大/最小值以及中位数,出来的结果为
29.6991176470588280.00.4228.0
同时我们也可以使用describe()
方法
df.describe()
output
PassengerIdSurvivedPclass...SibSpParchFarecount891.000000891.000000891.000000...891.000000891.000000891.000000mean446.0000000.3838382.308642...0.5230080.38159432.204208std257.3538420.4865920.836071...1.1027430.80605749.693429min1.0000000.0000001.000000...0.0000000.0000000.00000025%223.5000000.0000002.000000...0.0000000.0000007.91040050%446.0000000.0000003.000000...0.0000000.00000014.4545%668.5000001.0000003.000000...1.0000000.00000031.000000max891.0000001.0000003.000000...8.0000006.000000512.329200[8rowsx7columns]
当然我们也可以对于特定几列的数据进行统计分析
df.agg({"Age":["min","max","mean"],"Fare":["min","max","mean"]})
output
AgeFaremin0.4200000.000000max80.000000512.329200mean29.69911832.204208
除此之外,我们也可以通过groupby
方法来进行数据的统计,例如我们想要知道不同的性别之下的平均年龄分别是多少,可以这么来操作
df[["Sex","Age"]].groupby("Sex").mean()
output
AgeSexfemale27.915709male30.726645
另外,value_counts()
方法也可以针对单独某一列数据,看一下数据的具体分布,
df["Pclass"].value_counts()
output
349112162184Name:Pclass,dtype:int64
DataFrame中的排序问题
我们假设有这么一组数据,
data={"Name":["Mike","Peter","Clara","Tony","John"],"Age":[30,26,20,22,25]}df=pd.DataFrame(data)df
output
NameAge0Mike301Peter262Clara203Tony224John25
我们可以将数据按照“Age”年龄这一列来进行排序
df.sort_values(by="Age")
output
NameAge2Clara203Tony224John251Peter260Mike30
当然我们也可以按照降序来进行排列
df.sort_values("Age",ascending=False)
output
NameAge0Mike301Peter264John253Tony222Clara20
合并多个表格
例如我们有这么两个表格,
df1=pd.DataFrame({"Name":["Mike","John","Clara","Linda"],"Age":[30,26,20,22]})df2=pd.DataFrame({"Name":["Brian","Mary"],"Age":[45,38]})df_names_ages=pd.concat([df1,df2],axis=0)df_names_ages
output
NameAge0Mike301John262Clara203Linda220Brian451Mary38
因为上面两个表格有着两者的列名“Name”、“Age”,因此我们可以用concat
方法来进行合并,当然我们也可以用join
方法
df1=pd.DataFrame({"Name":["Mike","John","Clara","Sara"],"Age":[30,26,20,22],"City":["NewYork","Shanghai","London","Paris"],})df2=pd.DataFrame({"City":["NewYork","Shanghai","London","Paris"],"Occupation":["MachineLearningEnginner","DataScientist","Doctor","Teacher"]})df_merged=pd.merge(df1,df2,how="left",on="City")df_merged
output
NameAgeCityOccupation0Mike30NewYorkMachineLearningEnginner1John26ShanghaiDataScientist2Clara20LondonDoctor3Sara22ParisTeacher
两个表格都共有一列“City”,通过join
方法依次来进行合并。由于篇幅有限,小编在这里也就简单地提及一下,后面再专门写篇文章来详细说明。
时序问题的处理
在时序问题的处理上,小编之前专门写过一篇文章,具体可以看
干货分享 | Pandas处理时间序列的数据
例如我们有这么一个数据集
df=pd.read_csv("air_quality.csv")df=df.rename(columns={"date.utc":"datetime"})df.head()
output
citycountrydatetimelocationparametervalue0ParisFR-06-2100:00:00+00:00FR04014no220.01ParisFR-06-:00:00+00:00FR04014no221.82ParisFR-06-:00:00+00:00FR04014no226.53ParisFR-06-:00:00+00:00FR04014no224.94ParisFR-06-:00:00+00:00FR04014no221.4
我们看一下目前“datetime”这一列的数据类型
df.dtypes
output
cityobjectcountryobjectdatetimeobjectlocationobjectparameterobjectvaluefloat64dtype:object
我们可以用pandas
当中的to_datetime
方法将“datetime”这一列转换成“datetime”的格式
df["datetime"]=pd.to_datetime(df["datetime"])df["datetime"].head()
output
0-06-2100:00:00+00:001-06-:00:00+00:002-06-:00:00+00:003-06-:00:00+00:004-06-:00:00+00:00Name:datetime,dtype:datetime64[ns,UTC]
我们便可以查看起始的日期
df["datetime"].min(),df["datetime"].max()
output
(Timestamp('-05-0701:00:00+0000',tz='UTC'),Timestamp('-06-2100:00:00+0000',tz='UTC'))
中间相隔的时间
df["datetime"].max()-df["datetime"].min()
output
Timedelta('44days23:00:00')
文本数据的处理问题
当我们的数据集中存在文本数据时,pandas
内部也有相对应的处理方法
data={"FullName":["PeterParker","LindaElisabeth","BobDylan"],"Age":[40,50,60]}df=pd.DataFrame(data)df
output
FullNameAge0PeterParker401LindaElisabeth502BobDylan60
可以用str
方法将这些文本数据摘取出来,然后再进一步操作
df["FullName"].str.lower()
output
0 peter parker1lindaelisabeth2bobdylanName:FullName,dtype:object
或者也可以这样来操作
df["LastName"]=df["FullName"].str.split("").str.get(-1)df
output
FullNameAgeLastName0PeterParker40Parker1LindaElisabeth50Elisabeth2BobDylan60Dylan
这样我们可以将其“姓”的部分给提取出来,同样的我们也可以提取“名”的部分
df["FirstName"]=df["FullName"].str.split("").str.get(0)df
output
FullNameAgeLastNameFirstName0PeterParker40ParkerPeter1LindaElisabeth50ElisabethLinda2BobDylan60DylanBob
我们也可以通过contains
方法来查看字段中是不是包含了某一个字符串
df["FullName"].str.contains("Bob")
output
0False1False2TrueName:FullName,dtype:bool
同样也是通过str
方法将文本数据也提取出来再进行进一步的操作
往
期
回
顾
资讯
AI 考古比胡八一更高效
资讯
阿里云投入 20 亿发力操作系统
资讯
阿里发布云芯片倚天710
资讯
英特尔开源代码编程工具 ControFlag
分享
点收藏
点点赞
点在看