参考来源:Vitu.AIIndexing,SelectionandAssignmentSelectingspecificvaluesforapandasDataFrameorSeriestoprocessprettymuchanydata您将学习操作中的隐式步骤。因此,很好地理解如何拆分数据集是至关重要的。在此示例中,我们将查看澳大利亚墨尔本的房价数据。单击此处下载数据集。我们将csv文件上传到Vitu的数据集空间。我们将使用read_csv函数将数据读入DataFrame。执行此操作:importpandasaspdmelbourne_data=pd.read_csv('melb_data.csv')pd.set_option("display.max_rows",5)本机访问方法本机Python对象提供了许多很好的索引数据的方法。pandas包括所有这些,这有助于更容易上手。考虑这个DataFrame:melbourne_data在Python中,我们可以通过将其作为属性访问来访问对象的属性。例如,一本书对象可能有一个title属性,我们可以通过调用book.title来访问它。pandasDataFrame中的列以相同的方式工作。因此,要访问房价数据的地址属性,我们可以使用:melbourne_data.Address如果我们在Python中有一个dict对象,我们可以使用索引([])运算符访问它的值。同样,我们可以对pandasDataFrame列做同样的事情。melbourne_data['Address']这里有两种从pandasDataFrame中选择特定系列的方法。它们在语法上都不比另一个更有效,但索引运算符[]确实具有能够处理其中包含保留字符的列名的优势(例如,如果我们有一个国家普罗维登斯列,因为review.如果有空格,countryprovidence将不起作用)。pandasSeries看起来不像一本花哨的字典吗?差不多了,所以下钻到单个具体值也就不足为奇了,我们只需要再次使用索引运算符[]即可:melbourne_data['Address'][0]根据索引索引运算符选择数据,属性选择就可以了,因为它们像Python生态系统的其他部分一样工作。作为新手,这使它们易于使用。但是,pandas有自己的访问器运算符loc和iloc。对于更高级的操作,这些是您应该使用的。pandas索引以两种范式之一运行。第一种是基于索引的选择:数据是根据其在数据中的数字位置来选择的。iloc遵循这个范例。要选择此DataFrame中的第一行数据,我们可能会使用以下内容:melbourne_data.iloc[0]loc和iloc都是行在前,列在后。这与我们在原生Python中所做的相反,即列在前,行在后。这意味着检索行更容易,而检索列则稍微困难一些。要使用iloc获取列,我们可以执行以下操作:melbourne_data.iloc[:,0]:运算符,同样来自原生Python,意思是“全部”。但是,当与其他选择器结合使用时,它可用于指示值的范围。例如,要选择第一、第二和第三行房屋所在的郊区县列,我们会这样做:melbourne_data.iloc[:3,0]或者,如果只选择第二和第三行条目,我们会这样做:melbourne_data.iloc[1:3,0]也可以传递一个列表:melbourne_data.iloc[[0,1,2],0]最后,负数也可以用于选择。这将从值的末尾开始向前计数。例如,这里是数据集的最后五个元素。melbourne_data.iloc[-5:]根据标签选择数据属性选择的第二个例子是loc运算符后面的例子:基于标签的选择。在这个范例中,重要的是数据索引值,而不是它的位置。例如,要获取房价数据中的第一个条目,我们现在将执行以下操作:melbourne_data.loc[0,'Suburb']iloc在概念上比loc更简单,因为它忽略了数据集的索引。当我们使用iloc时,我们将数据集视为一个大矩阵(列表的列表),我们必须按位置进行索引。相反,loc使用索引中的信息来完成它的工作。由于您的数据集通常具有有意义的索引,因此使用loc通常更容易。例如,这里有一个使用loc的更简单的操作:melbourne_data.loc[:,['Suburb','Address','Price']]在loc和iloc之间选择或转换时,有一个“问题”,这两种方法使用略有不同的索引方案。iloc使用Pythonstdlib索引方案,它包括范围的第一个元素并排除最后一个元素。所以0:10将选择条目0,...,9。同时,loc包含索引。所以0:10将选择条目0,...,10。为什么要改变?请记住loc可以索引任何标准库类型:例如字符串。如果我们有一个索引值为Apples,...,Potatoes,...的DataFrame,并且我们想选择“苹果和土豆之间所有按字母顺序排列的水果”,那么使用df.loc['Apples':'Potatoes']比df.loc['Apples','Potatoet]更方便(t在字母表中位于s之后)。例如,当DataFrame索引是一个简单的数字列表时,这尤其令人困惑。0,...,1000。在这种情况下,df.iloc[0:1000]将返回1000个条目,而df.loc[0:1000]将返回1001个条目!要使用loc获取1000个元素,您需要删除一个并请求df.iloc[0:999]。根据标签选择操作索引从索引中的标签中获取强度。至关重要的是,我们使用的索引不是静态的。我们可以以我们认为合适的任何方式操纵索引。set_index方法可用于完成工作。以下是当您将set_index设置为标题字段时发生的情况:melbourne_data.set_index("Address")如果您可以提供比当前数据集更好的索引的数据集,那么执行set_index是很有用的。条件选择到目前为止,我们一直在使用DataFrame本身的结构属性来索引各种数据。然而,为了用数据做有趣的事情,我们往往需要有条件地提问。例如,假设我们对Abbotsford的房子特别感兴趣。我们可以从询问每个房子是否是Abbotsford开始:melbourne_data.Suburb=='Abbotsford'此操作根据每条记录的县郊区生成一系列真/假布尔值。然后可以在loc内部使用此结果来选择相关数据:melbourne_data.loc[melbourne_data.Suburb=='Abbotsford']这个DataFrame大约有56行。原来有~13580。这意味着大约0.4%的房屋来自Abbotsford。我们还想知道有多少房子的价格超过一定数量我们可以使用符号(&)将两个问题放在一起:melbourne_data.loc[(melbourne_data.Suburb=='Abbotsford')&(melbourne_data.Price>=1000000)]pandas带有许多预建的条件选择器,我们将在这里重点介绍其中的两个。第一个是伊辛。isin允许您选择值列表中数据“中”的值。例如,下面是我们如何使用它来仅选择来自Abbotsford或AirportWest的房屋:melbourne_data.loc[melbourne_data.Suburb.isin(['Abbotsford','AirportWest'])]).这些方法可以高亮显示不为空(NaN)的值。例如,要过滤掉数据集中缺少价格标签的房屋,我们将执行以下操作:melbourne_data.loc[melbourne_data.Price.notnull()]分配操作另一方面,将数据分配给DataFrame很容易。您可以指定一个常量值:melbourne_data['critic']='everyone'melbourne_data['critic']或使用可迭代的:melbourne_data['index_backwards']=range(len(melbourne_data),0,-1)melbourne_data['index_backwards']原文地址:数据处理【瑞士军刀pandas攻略】:2.数据索引、选择和赋值
