Pandas数据处理二
3.7 合并数据集: Concat与Append操作
将不同的数据源进行合并是数据科学中最有趣的事情之一, 这既包括将两个不同的数据集非常简单地拼接在一起, 也包括用数据库那样的连接(join) 与合并(merge) 操作处理有重叠字段的数据集。 Series 与DataFrame 都具备这类操作, Pandas 的函数与方法让数据合并变得快速简单。
先来用 pd.concat 函数演示一个 Series 与 DataFrame 的简单合并操作。 之后, 我们将介绍 Pandas 中更复杂的 merge 和 join 内存数据合并操作。
# Pandas 0.18版中的函数签名 pd.concat(objs, axis=0, join=‘outer‘, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
默认情况下, DataFrame 的合并都是逐行进行的(默认设置是 axis=0) 。 与 np.concatenate() 一样, pd.concat 也可以设置合并坐标轴, 例如下面的示例:
03. append()方法
因为直接进行数组合并的需求非常普遍, 所以 Series 和 DataFrame 对象都支持 append 方法, 让你通过最少的代码实现合并功能。 例如, 你可以使用 df1.append(df2), 效果与 pd.concat([df1,df2]) 一样:
需要注意的是, 与 Python 列表中的 append() 和 extend() 方法不同, Pandas 的 append() 不直接更新原有对象的值, 而是为合并后的数据创建一个新对象。 因此, 它不能被称之为一个非常高效的解决方案, 因为每次合并都需要重新创建索引和数据缓存。
总之, 如果你需要进行多个 append 操作, 还是建议先创建一个 DataFrame 列表, 然后用 concat() 函数一次性解决所有合并任务。
3.8 合并数据集: 合并与连接
Pandas 的基本特性之一就是高性能的内存式数据连接(join) 与合并(merge) 操作。 如果你有使用数据库的经验, 那么对这类操作一定很熟悉。 Pandas 的主接口是 pd.merge 函数, 下面让我们通过一些示例来介绍它的用法。
pd.merge() 函数实现了三种数据连接的类型: 一对一、 多对一和多对多。 这三种数据连接类型都通过pd.merge() 接口进行调用, 根据不同的数据连接需求进行不同的操作。 下面将通过一些示例来演示这三种类型, 并进一步介绍更多的细节。
01. 参数on的用法
最简单的方法就是直接将参数 on 设置为一个列名字符串或者一个包含多列名称的列表:
02. left_on与right_on参数
有时你也需要合并两个列名不同的数据集, 例如前面的员工信息表中有一个字段不是“employee”而
是“name”。 在这种情况下, 就可以用 left_on 和 right_on 参数来指定列名:
03. left_index与right_index参数
除了合并列之外, 你可能还需要合并索引。 就像下面例子中的数据那样:
how 参数支持的数据连接方式还有 ‘outer‘、 ‘left‘ 和 ‘right‘。 外连接(outer join) 返回两个输入列的
交集, 所有缺失值都用 NaN 填充:
左连接(left join) 和右连接(right join) 返回的结果分别只包含左列和右列, 如下所示
3.9 累计与分组
在对较大的数据进行分析时, 一项基本的工作就是有效的数据累计(summarization) : 计算累计
(aggregation) 指标, 如 sum()、 mean()、 median()、 min() 和 max(), 其中每一个指标都呈现了大数据
集的特征。 在这一节中, 我们将探索 Pandas 的累计功能, 从类似前面 NumPy 数组中的简单操作, 到基于
groupby 实现的复杂操作。
表3-3: Pandas的累计方法
指标 | 描述 |
count() | 计数项 |
first()、 last() | 第一项与最后一项 |
mean()、 median() | 均值与中位数 |
min()、 max() | 最小值与最大值 |
std()、 var() | 标准差与方差 |
mad() | 均值绝对偏差(mean absolute deviation) |
prod() | 所有项乘积 |
sum() | 所有项求和 |
3.9.3 GroupBy: 分割、 应用和组合
简单的累计方法可以让我们对数据集有一个笼统的认识, 但是我们经常还需要对某些标签或索引的局部进
行累计分析, 这时就需要用到 groupby 了。 虽然“分组”(group by) 这个名字是借用 SQL 数据库语言的命
令, 但其理念引用发明 R 语言 frame 的 Hadley Wickham 的观点可能更合适: 分割(split) 、 应用(apply)
和组合(combine) 。
为了得到这个结果, 可以对 DataFrameGroupBy 对象应用累计函数, 它会完成相应的应用 / 组合步骤
并生成结果:
In[13]: df.groupby(‘key‘).sum() Out[13]: data key A 3 B 5 C 7
GroupBy 中最重要的操作可能就是 aggregate、 filter、 transform 和 apply(累计、 过滤、 转换、 应
用) 了, 后文将详细介绍这些内容, 现在先来介绍一些 GroupBy 的基本操作方法
(1) 累计。 我们目前比较熟悉的 GroupBy 累计方法只有 sum() 和 median() 之类的简单函数, 但是
aggregate() 其实可以支持更复杂的操作, 比如字符串、 函数或者函数列表, 并且能一次性计算所有
累计值。 下面来快速演示一个例子:
(2) 过滤。 过滤操作可以让你按照分组的属性丢弃若干数据。 例如, 我们可能只需要保留标准差超过某
个阈值的组:
(3) 转换。 累计操作返回的是对组内全量数据缩减过的结果, 而转换操作会返回一个新的全量数据。 数
据经过转换之后, 其形状与原来的输入数据是一样的。 常见的例子就是将每一组的样本数据减去各组
的均值, 实现数据标准化:
(4) apply() 方法。 apply() 方法让你可以在每个组上应用任意方法。 这个函数输入一个
DataFrame, 返回一个 Pandas 对象(DataFrame 或 Series) 或一个标量(scalar, 单个数值) 。 组合
操作会适应返回结果类型。
用 DataFrame 的 pivot_table 实现的效果等同于上一节的管道命令的代码:
01. 与Python字符串方法相似的方法
几乎所有 Python 内置的字符串方法都被复制到 Pandas 的向量化字符串方法中。 下面的表格列举了
Pandas 的 str 方法借鉴 Python 字符串方法的内容:
len() lower() translate() islower()
ljust() upper() startswith() isupper()
rjust() find() endswith() isnumeric()
center() rfind() isalnum() isdecimal()
zfill() index() isalpha() split()
strip() rindex() isdigit() rsplit()
rstrip() capitalize() isspace() partition()
lstrip() swapcase() istitle() rpartition()