当前位置: 首页 > 后端技术 > Python

Pandas:深入理解Pandas的数据结构

时间:2023-03-26 11:49:54 Python

[toc]简介本文将讲解Pandas中的基本数据类型Series和DataFrame,并详细讲解这两种类型的创建、索引等基本行为。使用Pandas需要参考以下库:In[1]:importnumpyasnpIn[2]:importpandasaspdSeriesSeries是一个带标签和索引的一维数组。我们使用以下方法创建系列:>>>s=pd.Series(data,index=index)其中数据可以是Python字典、npndarray或标量。index是横轴上的标签列表。接下来我们看看如何单独创建一个Series。从ndarray创建s=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])sOut[67]:a-1.300797b-2.044172c-1.170739d-0.445290e1.208784dtype:float64使用索引获取索引:s.indexOut[68]:Index(['a','b','c','d','e'],dtype='object')从字典创建d={'b':1,'a':0,'c':2}pd.Series(d)Out[70]:a0b1c2dtype:int64从创建标量pd.Series(5.,index=['a','b','c','d','e'])Out[71]:a5.0b5.0c5.0d5.0e5.0dtype:float64SeriesndarraySeries和ndarray非常相似。在系列中使用索引值就像ndarray:s[0]Out[72]:-1.3007972194268396s[:3]Out[73]:a-1.300797b-2.044172c-1.170739dtype:float64s[s>s.median()]Out[74]:d-0.445290e1.208784dtype:float64s[[4,3,1]]Out[75]:e1.208784d-0.445290b-2.044172dtype:float64Series而如果dict使用label访问Series,它表现得像dict:s['a']Out[80]:-1.3007972194268396s['e']=12.sOut[82]:a-1.300797b-2.044172c-1.170739d-0.445290e12.000000dtype:float64向量化操作和标签对齐系列可以更简单地使用单向量化操作:s+sOut[83]:a-2.601594b-4.088344c-2.341477d-0.890581e24.000000dtype:float64s*2Out[84]:a-2.601594b-4.088344c-2.341477d-0.890564ndptype.exp(s)Out[85]:a0.272315b0.129487c0.310138d0.640638e162754.791419dtype:float64Name属性Series还有一个name属性,我们可以在创建的时候设置:s=pd.Series(np.random.randn(5)、name='something')sOut[88]:00.19227210.11041021.4423583-0.37579241.228111Name:something,dtype:float64s还有一个rename方法可以重命名s:s2=s.rename("different")DataFrameDataFrame是一个带标签的二维数据结构,它由Series组成,你可以把DataFrame看成一个excel表格DataFrame可以从以下类型的数据创建:一维ndarrays、列表、dict或Series结构化数组以创建二维numpy。{'一':pd.Series([1.,2.,3.],index=['a','b','c']),'二':pd.Series([1.,2.,3.,4.],index=['a','b','c','d'])}df=pd.DataFrame(d)dfOut[92]:onetwoa1.01.0b2.02.0c3.03.0dNaN4.0用于索引重排:pd.DataFrame(d,index=['d','b','a'])Out[93]:onetwodNaN4.0b2.02.0a1.01.0用于列重排:pd.DataFrame(d,index=['d','b','a'],columns=['two','three'])Out[94]:twothreed4.0NaNb2.0NaNa1.0NaN创建d={'one':[1.,2.,3.,4.],'two':[4.,3.,2.,1.]}pd.DataFrame(d)来自ndarrays并列出Out[96]:一二01.04.012.03.023.02.034.01.0pd.DataFrame(d,index=['a','b','c','d'])Out[97]:一二a1.04.0b2.03.0c3.02.0d4.01.0从结构化数组创建DF可以从结构化数组创建:In[47]:data=np.zeros((2,),dtype=[('A','i4'),('B','f4'),('C','a10')])In[48]:data[:]=[(1,2.,'Hello'),(2,3.,"World")]In[49]:pd.DataFrame(data)Out[49]:ABC012.0b'Hello'123.0b'World'In[50]:pd.DataFrame(data,index=['first','second'])Out[50]:ABCfirst12.0b'Hello'second23.0b'World'In[51]:pd.DataFrame(data,columns=['C','A','B'])Out[51]:CAB0b'Hello'12.01b'World'23.0从字典列表中创建[52]:data2=[{'a':1,'b':2},{'a':5,'b':10,'c':20}]In[53]:pd.DataFrame(data2)Out[53]:abc012NaN151020.0In[54]:pd.DataFrame(data2,index=['first','second'])Out[54]:abcfirst12NaNsecond51020.0In[55]:pd.DataFrame(data2,columns=['a','b'])Out[55]:ab0121510从元组创建一个更复杂的DF可以从元组创建:In[56]:pd.DataFrame({('a','b'):{('A','B'):1,('A','C'):2},....:('a','a'):{('A','C'):3,('A','B'):4},....:('a','c'):{('A','B'):5,('A','C'):6},....:('b','a'):{('A','C'):7,('A','B'):8},....:('b','b'):{('A','D'):9,('A','B'):10}})....:Out[56]:abbacabAB1.04.05.08.010.0C2.03.06.07.0NaNDNaNNaNNaNNaN9.0列的选择、添加和删除可以像Series一样操作DF:In[64]:df['one']Out[64]:a1.0b2.0c3.0dNaNName:one,dtype:float64In[65]:df['three']=df['one']*df['two']In[66]:df['flag']=df['one']>2In[67]:dfOut[67]:onetwothreeflaga1.01.01.0Falseb2.02.04.0Falsec3.03.09.0TrueedNaN4.0NaNFalse可以删除特定的列,或者pop操作:在[68]中:deldf['two']在[69]中:three=df.pop('three')In[70]:dfOut[70]:oneflaga1.0Falseb2.0Falsec3.0TruedNaNFalse如果插入常量,将填充整列:In[71]:df['foo']='bar'In[72]:dfOut[72]:oneflagfooa1.0Falsebarb2.0Falsebarc3.0TruebardNaNFalsebar默认会插入到DF的最后一列,可以使用insert指定插入特定的Col嗯:在[75]:df.insert(1,'bar',df['one'])In[76]:dfOut[76]:onebarflagfooone_trunca1.01.0Falsebar1.0b2.02.0Falsebar2.0c3.03.0TruebarNaNdNaNNaNFalsebarNaN使用assign从现有列派生新列:In[77]:iris=pd.read_csv('data/iris.data')In[78]:iris.head()Out[78]:SepalLengthSepalWidthPetalLengthPetalWidthName05.13.51.40.2Iris-setosa14.93.01.40.2Iris-setosa24.73.21.30.2Iris-setosa34.63.11.50.2Iris-setosa45.03.61.40:2Iris-setosa45.03.61.40:2Iris-setosa(sepal_ratio=iris['SepalWidth']/iris['SepalLength'])....:.head())....:Out[79]:SepalLengthSepalWidthPetalLengthPetalWidthNamesepal_ratio05.13.51.40.2Iris-seTOSA0.68627514.93.01.40.2iris-setosa0.61224524.73.21.30.2iris-setosa0.68085134.64.63.11.50.2iris-setosa0.67391345.03.61.40.61.40.40.40.2iris-setosan.720000注意在DF中用一个表来表示索引和选择:操作语法返回结果selectcolumndf[col]Seriesselectrowdf.loc[label]Seriesselectrowdfthrougharraydf.iloc[loc]Seriesrowslicedf[5:10]DataFrame使用布尔向量选择行df[bool_vec]DataFrame本文已收录于http://www.flydean.com/03-python-pandas-data-structures/最通俗的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!