来源
PythonDataAnalysis3rdEdition
作者
Navlani,etal.
翻译
Harper
校对
gongyouliu
编辑
auroral-L
全文共字,预计阅读时间40分钟。第二章NumPy和pandas(下)
10.Boolean和fancyindexing
11.数组的广播(Broadcasting)机制
12.创建pandasDataFrames
13.了解pandasSeries
14.读取和查询Quandl数据
15.描述pandasDataFrames
16.PandasDataFrames的分组与连接
17.处理缺失的值
18.创建数据透视表
19.处理日期
20.总结
21.参考文献
10.Boolean和fancyindexing
索引技术可帮助我们从NumPy数组中选择和过滤元素。在本节中,我们将重点介绍booleanindexing和fancyindexing。Booleanindexing使用布尔表达式代替索引(在方括号中)来过滤NumPy数组。此索引返回布尔表达式中的真值元素:
#CreateNumPyArrayarr=np.arange(21,41,2)print("OrignialArray:\n",arr)#BooleanIndexingprint("AfterBooleanCondition:",arr[arr30])Output:OrignialArray:[]AfterBooleanCondition:[31]
Fancyindexing是一种特殊的索引类型,其中数组的元素由索引数组选择。这意味着传递括号中的索引数组。fancyindexing还支持多维数组。这将帮助我们选择和修改复杂的多维数组集。让我们看一个如下的例子来理解fancyindexing:
#CreateNumPyArrayarr=np.arange(1,21).reshape(5,4)print("OrignialArray:\n",arr)#Selecting2ndand3rdrowindices=[1,2]print("Selected1stand2ndRow:\n",arr[indices])#Selecting3ndand4throwindices=[2,3]print("Selected3rdand4thRow:\n",arr[indices])Output:OrignialArray:[[][][][][]]Selected1stand2ndRow:[[][]]Selected3rdand4thRow:[[][]]
在前面的代码中,我们创建了5*4矩阵,并使用整数索引选择了行。你还可以通过下图可视化此输出:
我们看如下代码:
#Createrowandcolumnindicesrow=np.array([1,2])col=np.array([2,3])print("SelectedSub-Array:",arr[row,col])Output:SelectedSub-Array:[]
前面的示例生成第一个值[1,2]和第二个值[2,3],并将其作为行索引和列索引。数组将在第一个索引值和第二个索引值处选择值,分别是7和12。
11.数组的广播(Broadcasting)机制
Python列表不支持直接向量化算术运算。与基于Python列表循环的操作相比,NumPy提供了更快的向量化数组操作。在这里,所有循环操作都是使用C而不是Python来执行的,这会使它执行得更快。广播功能检查运用在不同形状的数组上的二元函数的一系列规则(例如加,减和乘)。
我们来看一个广播的例子:
#CreateNumPyArrayarr1=np.arange(1,5).reshape(2,2)print(arr1)Output:[[12][34]]#CreateanotherNumPyArrayarr2=np.arange(5,9).reshape(2,2)print(arr2)Output:[[56][78]]#Addtwomatricesprint(arr1+arr2)Output:[[68][]]
在前面的三个示例中,我们可以看到两个相同大小的数组的加法。这个概念被称为广播:
#Multiplytwomatricesprint(arr1*arr2)Output:[[][]]
在前面的示例中,两个矩阵相乘。接下来我们应用标量值执行加法和乘法:
#Addascalervalueprint(arr1+3)Output:[[45][67]]#Multiplywithascalarvalueprint(arr1*3)Output:[[36][]]
在前面的两个示例中,示例1的结果是矩阵1加上了标量值,示例二是矩阵1乘以标量值。
12.创建pandasDataFrames
pandas库旨在与panel数据或表格数据一起使用。pandas是一种快速,高效且有生产力的工具,用于处理和分析字符串,数字,日期和时间序列等数据。pandas提供了诸如DataFrames和Series的数据结构。pandasDataFrame是一种具有行和列的表格化的数据结构,这种数据结构具有二维标签和索引。它的列是异构类型。它具有处理不同类型的对象,执行分组和合并操作,处理缺失值,创建数据透视表以及处理日期的功能。pandasDataFrame可以通过多种方式创建。现在我们来创建一个空的DataFrame:
#Importpandaslibraryimportpandasaspd#CreateemptyDataFramedf=pd.DataFrame()#Headerofdataframe.df.head()Output:_
在前面的示例中,我们创建了一个空的DataFrame。现在让我们使用列表字典(dictionaryofthelist)来创建一个DataFrame:
#Createdictionaryoflistdata={Name:[Vijay,Sundar,Satyam,Indira],Age:[23,45,46,52]}#CreatethepandasDataFramedf=pd.DataFrame(data)#Headerofdataframe.df.head()Output:NameAge0VijaySundarSatyamIndira52
在前面的代码中,我们使用了列表字典来创建DataFrame。此处,字典的关键字等效于列,而值等效于DataFrame的行。接下来我们使用字典列表(listofdictionaries)来创建一个DataFrame:
#PandasDataFramebylistsofdicts.#Initialisedatatolists.data=[{Name:Vijay,Age:23},{Name:Sundar,Age:25},{Name:Shankar,Age:26}]#CreatesDataFrame.df=pd.DataFrame(data,columns=[Name,Age])#Printdataframeheaderdf.head()
在前面的代码中,使用了字典列表创建DataFrame。在列表中,每个项都是一个字典。每个项的关键字是列的名称,而值是行单元格的值。现在我们使用元组列表(listoftuples)来创建一个DataFrame:
#CreatingDataFrameusinglistoftuples.data=[(Vijay,23),(Sundar,45),(Satyam,46),(Indira,52)]#Createdataframedf=pd.DataFrame(data,columns=[Name,Age])#Printdataframeheaderdf.head()Output:NameAge0VijaySundarShankar26
在前面的代码中,使用元组列表创建DataFrame。在列表中,每一项都是一个元组,每个元组都等同于列的行。
13.了解pandasSeries
pandasSeries是一维顺序数据结构,能够处理任何类型的数据,例如字符串,数字,日期,Python列表以及带有标签和索引的字典。Series是DataFrame的列之一。我们可以使用Python字典,NumPy数组和标量值来创建一个Series。我们还将在本节的后半部分看到pandasSeries的功能和特性。接下来我们来创建一些PythonSeries:
√使用Python字典:创建一个字典(dictionary)对象并将其传递给Series对象。让我们看下面的例子:
#CreatingPandasSeriesusingDictionarydict1={0:Ajay,1:Jay,2:Vijay}#CreatePandasSeriesseries=pd.Series(dict1)#ShowseriesseriesOutput:0Ajay1Jay2Vijaydtype:object
√使用NumPy数组:创建一个NumPy数组对象,并将其传递给Series对象。让我们看下面的例子:
#LoadPandasandNumPylibrariesimportpandasaspdimportnumpyasnp#CreateNumPyarrayarr=np.array([51,65,48,59,68])#CreatePandasSeriesseries=pd.Series(arr)seriesOutput:dtype:int64
√使用单个标量值:要创建具有标量值的pandasSeries,要将标量值和索引列表传递给Series对象:
#loadPandasandNumPyimportpandasaspdimportnumpyasnp#CreatePandasSeriesseries=pd.Series(10,index=[0,1,2,3,4,5])seriesOutput:dtype:int64
接下来让我们看一看pandasSeries的一些功能:
√我们还可以通过选择一列(例如country)来创建Series,该列恰好是数据文件中的第一列。然后,显示在局部范围内的当前对象的类型:
#Importpandasimportpandasaspd#Loaddatausingread_csv()df=pd.read_csv("WHO_first9cols.csv")#Showinitial5recordsdf.head()
结果为以下输出:
在前面的代码中,我们已使用read_csv()函数读取WHO_first9cols.csv文件。你可以从以下GitHub位置下载此文件: