Python – 创建 Pandas Index 的新视图
在 Pandas 中,Index 是一个关键对象,它类似于一个数学集合,表示一组唯一数据标识符。可以使用 Index 对象在 Pandas Series 和 DataFrame 中设置和检索数据。在这篇文章中,我们将讲解如何使用 Pandas 创建 Index 的新视图。
创建 Pandas Index
在开始讲解如何创建 Pandas Index 的新视图之前,我们先复习一下如何创建 Pandas Index。Pandas 中最常见的 Index 对象是基于一维数组和时间戳的 DatetimeIndex 和 Int64Index,但是,你还可以根据你的需求创建各种类型的 Index 对象。
首先,我们来看如何创建常见的 DatetimeIndex 和 Int64Index。
import pandas as pd
# 从日期字符串创建DatetimeIndex
dates = ['2020-01-01', '2020-01-02', '2020-01-03']
datetime_index = pd.DatetimeIndex(dates)
print(datetime_index)
# 创建Int64Index
int_index = pd.Index([1, 2, 3, 4])
print(int_index)
输出:
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]', freq=None)
Int64Index([1, 2, 3, 4], dtype='int64')
在上面的代码中,我们首先使用 pd.DatetimeIndex() 函数从日期字符串创建了一个 DatetimeIndex 对象。然后,我们同样使用 pd.Index() 函数基于整数列表创建了一个 Int64Index 对象。
除此之外,Pandas 还支持从多个数组创建 Index。下面的示例演示了如何从多个数组创建 MultiIndex。
import pandas as pd
# 创建两个series
s1 = pd.Series([0, 1, 2], name='s1')
s2 = pd.Series([3, 4, 5], name='s2')
# 从两个Series创建MultiIndex
multi_index = pd.MultiIndex.from_arrays([s1, s2], names=['s1', 's2'])
# 创建一个DataFrame对象
data = {'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]}
df = pd.DataFrame(data, index=multi_index)
print(df)
输出:
a b c
s1 s2
0 3 1 4 7
1 4 2 5 8
2 5 3 6 9
在上面的代码中,我们创建了两个 Series 对象 s1 和 s2,并使用 pd.MultiIndex.from_arrays() 函数从它们创建了一个 MultiIndex 对象。接下来,我们使用 MultiIndex 作为 DataFrame 的索引,从而创建了一个具有 MultiIndex 的 DataFrame。
Pandas Index 的新视图
有时候,你可能需要创建一个 Index 的新视图,以便在不改变原始 Index 的情况下,对它进行修改或切片操作。为此,Pandas 提供了两种方法:reindex() 和 take()。
reindex() 方法
reindex() 方法用于重新索引一个数组,它也可以用于重新构造 Index 的新视图。
import pandas as pd
# 创建一个简单的Index对象
index = pd.Index(['a', 'b', 'c'])
# 重新索引并创建新Index对象
new_index = index.reindex(['c', 'b', 'a'])
print(new_index)
输出:
Index(['c', 'b', 'a'], dtype='object')
在上面的代码中,我们首先创建一个简单的 Index 对象 index。然后,我们使用 index.reindex() 方法创建了一个新的 Index 对象 new_index,新对象的顺序是原始 Index 的倒序。事实上,reindex() 方法的返回值也是一个 Index 对象的新视图,而不是原始对象。
除了可以重新排列元素的顺序外,reindex() 方法还可以用于扩展或缩小 Index 对象的长度,可以通过指定方法来填充缺失的值。下面的示例演示了如何使用 reindex() 方法扩展一个 Index 对象的长度。
import pandas as pd
# 创建一个有序的Index对象
index = pd.Index([1, 3, 5, 7, 9])
# 扩展Index的长度
new_index = index.reindex(range(10))
print(new_index)
输出:
Int64Index([1, 3, 5, 7, 9, nan, nan, nan, nan, nan], dtype='int64')
在上面的代码中,我们将一个有序的 Index 对象 index 扩展到长度为 10,其中原始的 5 个元素被保留,而新的 5 个元素被填充为 NaN。当 reindex() 方法无法匹配原始 Index 中的元素时,它会将缺失的值填充为 NaN。该方法还支持其他填充方式,例如向前或向后填充,这些填充方式可以通过 method 参数来指定。
take() 方法
take() 方法将根据提供的整数数组返回 Index 对应的元素。
import pandas as pd
# 创建一个简单的Index对象
index = pd.Index(['a', 'b', 'c'])
# 使用take()方法获取Index的元素
new_index = index.take([2, 1, 0])
print(new_index)
输出:
Index(['c', 'b', 'a'], dtype='object')
在上面的代码中,我们使用 take() 方法创建了一个新的 Index 对象,并提取了原始 Index 中的 3 个元素,但是顺序被倒序排列了。与 reindex() 方法不同,take() 方法不支持修改或扩展 Index 对象的长度,返回的新 Index 对象的长度与提供的整数数组的长度相同。
总结
在本文中,我们介绍了如何使用 Pandas 创建常见的 DatetimeIndex 和 Int64Index,以及如何使用 pd.MultiIndex.from_arrays() 创建 MultiIndex 对象。我们还讨论了如何使用 reindex() 和 take() 方法创建 Pandas Index 的新视图,这些方法支持修改或提取 Index 对象的元素,而不改变原始 Index 对象本身。
极客笔记