操作 Pandas 中的数据:索引对象
数据科学的一个重要部分是操作数据来对其进行分析。 (一条经验法则是,在任何数据科学项目中,80% 的都在清理和整理项目的数据。)因此,有必要了解 Pandas 提供用于处理 Series 中(特别是 DataFrames 中)的数据的工具。 由于这两种数据结构都是有序的,因此我们先要深入了解是什么使它们拥有现在的结构:Index。
Pandas 中的 Index 对象
Pandas 中的 Series 和 DataFrames 都具有显式索引,使你能够在其中引用和修改数据。 这些索引实际上是对象本身。 可将 Index 对象视为不可变的数组或固定大小的集。
值得花时间了解 Index 对象的属性。 让我们回到本部分前面的一个示例来检查这些属性。
series_example = pd.Series([-0.5, 0.75, 1.0, -2], index=['a', 'b', 'c', 'd'])
ind = series_example.index
ind
输出为:
Index(['a', 'b', 'c', 'd'], dtype='object')
Index 的工作方式与数组很像。 你已经了解如何使用标准 Python 索引表示法来检索值或切片:
ind[1]
输出为:
'b'
另一个示例:
ind[::2]
输出为:
Index(['a', 'c'], dtype='object')
但 Index 对象不可变,并且不能通过常规方式进行修改:
ind[1] = 0
错误输出为:
TypeError Traceback (most recent call last)
<ipython-input-34-906a9fa1424c> in <module>
----> 1 ind[1] = 0
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in __setitem__(self, key, value)
2063
2064 def __setitem__(self, key, value):
-> 2065 raise TypeError("Index does not support mutable operations")
2066
2067 def __getitem__(self, key):
TypeError: Index does not support mutable operations
这种不可变性是一件好事。 这使得在多个 Series 或 DataFrames 之间共享索引更安全,不会导致意外索引修改引起的可能问题。
亲自试一试
除了与数组相似,Index 的行为也与固定大小的集相似。 这包括遵循 Python 的内置集数据结构所采用的许多约定,以便能够以熟悉的方式计算并集、交集、差集和其他组合。 接下来,让我们操作一下来查看功能演示。
ind_odd = pd.Index([1, 3, 5, 7, 9])
ind_prime = pd.Index([2, 3, 5, 7, 11])
请尝试以下做法:
- 交集 (
ind_odd & ind_prime) - 并集 (
ind_odd | ind_prime) -
ind_odd ^ ind_prime和ind_odd的对称差集 (ind_prime)
提示(展开以显示)
ind_odd & ind_prime
Int64Index([3, 5, 7], dtype='int64')
ind_odd | ind_prime
Int64Index([1, 2, 3, 5, 7, 9, 11], dtype='int64')
ind_odd ^ ind_prime
Int64Index([1, 2, 9, 11], dtype='int64')
你还可通过对象方法(如 ind_odd.intersection(ind_prime))来访问这些操作。 下表列出了一些有用的 Index 方法和属性。
| 方法 | 说明 |
|---|---|
append |
与其他 Index 对象串联来生成新的 Index |
diff |
计算差集得到 Index |
drop |
删除传递的值来计算新的 Index |
insert |
在索引 Index 处插入元素来计算新的 i |
is_monotonic |
如果每个元素大于或等于上一个元素,则返回 True |
is_unique |
如果 True 没有重复值,则返回 Index |
isin |
计算一个布尔数组,该数组指示每个值是否包含在传递的集合中 |
unique |
按先后顺序计算唯一值的数组 |