对 Pandas 中的数据进行操作
开始从事数据科学工作时,对数据进行操作是必不可少的。 使 Pandas 成为许多数据科学家关注的工具的另一方面是,Pandas 能够对数据执行高效的元素级操作。 Pandas 基于 NumPy 的 ufuncs 来提供这些功能。 然后,它扩展了这些功能,为数据操作提供额外的能力。 例如:
- 对于一元运算(例如求反函数和三角函数),Pandas 中的
ufuncs会在输出中保留索引和列标签。 - 对于二元运算(例如加法和乘法),Pandas 会在将对象传递到
ufuncs时自动对齐索引。
这些关键功能意味着在操作数据时会保留数据的上下文。 更重要的是,当你组合多个源的数据时,这些功能有助于显著减少错误。
索引保留
Pandas 明确设计为与 NumPy 配合使用。 因此,所有 NumPy ufuncs 都适用于 Pandas Series 和 DataFrame 对象。
更清楚地理解这一点,请对要操作的随机数字创建一个简单的 Series 和 DataFrame。
rng = np.random.RandomState(42)
ser_example = pd.Series(rng.randint(0, 10, 4))
ser_example
输出为:
0 6
1 3
2 7
3 4
dtype: int64
你是否注意到了与变量 rng 一起使用的 NumPy 函数? 通过指定随机数生成器的种子,每次都会获得相同的结果。 当你需要生成必须可供其他人复制的伪随机输出时,这个技巧可能很有用。 (请继续操作并重新运行几次上面的代码单元,使自己确信每次都会生成相同的输出。)
df_example = pd.DataFrame(rng.randint(0, 10, (3, 4)),
columns=['A', 'B', 'C', 'D'])
df_example
输出为:
| | A | B | C | D |
--------------------------
| 0 | 6 | 9 | 2 | 6 |
| 1 | 7 | 4 | 3 | 7 |
| 2 | 7 | 2 | 5 | 4 |
让我们将 ufunc 应用到示例 Series:
np.exp(ser_example)
输出为:
0 403.428793
1 20.085537
2 1096.633158
3 54.598150
dtype: float64
在示例 DataFrame 中执行稍微复杂一点的操作时,也会发生同样的事情:
np.cos(df_example * np.pi / 4)
输出为:
| | A | B | C | D |
-------------------------------------------------------------------------
| 0 | -1.836970e-16 | 7.071068e-01 | 6.123234e-17 | -1.836970e-16 |
| 1 | 7.071068e-01 | -1.000000e+00 | -7.071068e-01 | 7.071068e-01 |
| 2 | 7.071068e-01 | 6.123234e-17 | -7.071068e-01 | -1.000000e+00 |
你可用同样的方式使用我们前面讨论过的所有 ufuncs。
索引对齐
对两个 Series 或 DataFrame 对象执行二元运算时,Pandas 会在执行操作的过程中对齐索引。 这在处理不完整的数据(数据通常不完整)时非常重要,但看看它的实际运用情况有助于更好地理解它。