小伙伴们,今天这篇文章里讲到的操作,专业的数据科学家每天都会执行这个动作数十次。你当然也可以做到!
概述
选择pandas DataFrame或Series中的特定值进行操作是几乎任何数据操作中的一个隐含步骤,因此在使用Python处理数据时,你需要首先学习如何快速有效地选择与你相关的数据点。
咱们在这一篇文章里还是使用我的另一篇文章数据文件(大家可以去我这篇文章里下载):
政安晨:快速学会~机器学习的Pandas数据技能(一)(建立与读数据)https://blog.csdn.net/snowdenkeke/article/details/136076433大家准备好环境,跟我一切开始吧:
import pandas as pd
reviews = pd.read_csv("./melb_data.csv", index_col=0)
pd.set_option('display.max_rows', 5)
原生访问
本地Python对象提供了很好的数据索引方式。Pandas将所有这些特性都带了过来,这有助于使其易于开始使用。
考虑以下DataFrame(咱们接着上述代码执行):
reviews
政安晨的执行:
在Python中,我们可以通过将其作为属性访问来访问对象的属性。例如,一个“书籍”对象可能有一个标题属性,我们可以通过调用book.title来访问它。在pandas DataFrame中的列的工作方式与此类似。
因此,要访问reviews的Address属性,我们可以使用:
reviews.Address
大家千万注意啊,Python语言是大小写敏感的,所以数据中是什么字符就用什么字符来操作,不能忽略大小写。
如果我们有一个Python字典,我们可以使用索引([])运算符访问其值。我们可以对DataFrame中的列执行相同的操作:
reviews['Address']
这是从DataFrame中选择特定Series的两种方法。它们在语法上都是有效的,没有更多或更少有效的说法,但是索引操作符 [] 具有一个优点,它可以处理列名中带有保留字符的情况(例如,如果我们有一个国家省份列,reviews.country providence 将无法正常工作)。
难道pandas的Series不是看起来像一个高级字典吗?它确实很像,所以也不奇怪,为了深入到一个特定的值,我们只需要再次使用索引操作符 []:
reviews['Address'][0]
其实这种访问的方式已经过时了,下面警告为:
FutureWarning: Series.getitem 将键视为位置已经过时。在将来的版本中,整数键将始终视为标签(与DataFrame的行为一致)。要通过位置访问值,请使用ser.iloc[pos]
。
索引操作符和属性选择器非常好用,因为它们的使用方式与 Python 生态系统中的其他部分完全一样。对于初学者来说,这使得它们易于上手和使用。然而,pandas 有自己的访问器操作符 loc 和 iloc。对于更高级的操作,你应该使用这些操作符。
基于索引的选择
Pandas索引有两种范例。
第一种是基于索引的选择: 根据数据在索引中的数值位置选择数据。 iloc遵循这种范例。
要选择DataFrame中的第一行数据,我们可以使用以下代码:
reviews.iloc[0]
政安晨执行:
无论是 loc 还是 iloc,都是行优先,列次之。这与我们在原生 Python 中的方式相反,原生 Python 是列优先,行次之。
这意味着获取行要稍微容易一些,而获取列要稍微困难一些。要使用 iloc 获取列,我们可以按照以下方式操作:
reviews.iloc[:, 0]
独立使用的冒号(:)运算符来自原生Python,表示“全部内容”。然而,当与其他选择器结合使用时,它可以用来表示一系列的值。例如,要仅选择第一行、第二行和第三行的列,我们可以这样做(这个是作用在第0列上的选择):
reviews.iloc[:3, 0]
或者,如果我们只想选择第二个和第三个条目,我们可以这样做:
reviews.iloc[1:3, 0]
也可以传递一个列表:
reviews.iloc[[0, 1, 2], 0]
最后,值得知道的是,可以在选择中使用负数。这将从值的末尾开始向前计数。所以例如,这是数据集的最后五个元素。
reviews.iloc[-5:]
基于标签的选择
基于标签的选择 属性选择的第二种范式是loc运算符所遵循的范式:基于标签的选择。在这种范式中,关键是数据索引值,而不是其位置。
例如,要获取数据中行标签为:Abbotsford,而列标签为Address的条目,我们现在可以这样做:
reviews.loc['Abbotsford', 'Address']
iloc在概念上比loc简单,因为它忽略了数据集的索引。当我们使用iloc时,我们将数据集视为一个大矩阵(一个列表的列表),我们需要按位置索引进入其中。相反,loc使用索引中的信息来完成其工作。由于数据集通常具有有意义的索引,通常使用loc更容易进行操作。
例如,以下操作使用loc更容易:
reviews.loc[:, ['Address', 'Price', 'Date']]
在选择使用loc和iloc之间的区别时
当在loc
和iloc
之间选择或切换时,有一个要记住的要点,就是这两种方法使用稍微不同的索引方案。
iloc
使用Python标准库的索引方案,其中范围的第一个元素被包含在内,最后一个元素被排除在外。因此,0:10将选择条目0,...,9。而loc
则是包含索引的。因此,0:10将选择条目0,...,10。
为什么会有这样的改变呢?
请记住,loc可以索引任何标准库类型,例如字符串。如果我们有一个包含索引值为“Apples”,“...”,“Potatoes”,“...”的DataFrame,我们想要选择“在Apples和Potatoes之间的所有字母水果选择”,那么使用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.loc[0:999]。
除此之外,使用loc的语义与使用iloc的语义相同。
操纵索引
基于标签的选择从索引中获取其能力。
关键是,我们使用的索引是可变的。我们可以根据需要以任何方式操作索引。
set_index()方法可以用来完成这个任务。
下面是当我们将索引设置为标题字段时会发生的事情:
reviews.set_index("Address")
咱们现在将地址栏设置成了索引列。
如果你能提出一个比当前索引更好的数据集指标,那么这种改变的方式将是非常有用的。
条件选择
到目前为止,我们一直在使用DataFrame本身的结构属性对各种数据进行索引。然而,为了对数据进行有趣的操作,我们经常需要根据条件提出问题。
例如,假设我们特别关注房间与房价的情况。
我们可以先检查房间数量(是否2间):
reviews.Rooms == '2'
这个操作基于每条记录的房间数量是否为2间产生了一个True / False布尔值的Series。
赋值数据
将数据分配给DataFrame很容易,您可以分配一个常量值:
reviews['critic'] = 'everyone' reviews['critic']
政安晨执行:
或者使用一个可迭代的值:
reviews['index_backwards'] = range(len(reviews), 0, -1)
reviews['index_backwards']
告一段落
现在您已经了解的Pandas数据操作的索引、选择和赋值,建立了这样的认识,就可以开展下一步的工作啦。