1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 干货!整理了50个 Pandas 高频使用技巧 强烈建议收藏!

干货!整理了50个 Pandas 高频使用技巧 强烈建议收藏!

时间:2018-11-12 10:16:40

相关推荐

干货!整理了50个 Pandas 高频使用技巧 强烈建议收藏!

作者 | 俊欣

来源 |关于数据分析与可视化

今天小编来分享在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

分享

点收藏

点点赞

点在看

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。