第 8 章
什么是数据整理?
什么是数据挖掘?
什么是机器学习?
Series
,其索引为列表的列表。MultiIndex
对象表示分层索引。有了分层索引,就可以进行部分索引。 这允许简洁地选择数据子集。
.loc
进行基于标签的索引。:
选择所有外层。2
选择内层索引等于 2 的数据。unstack()
和 stack()
unstack()
: 将数据重塑为 DataFrame。它将(行)索引的一个级别“透视”为列标签。stack()
: unstack()
的逆操作。它将列标签透视为(行)MultiIndex 中的一个级别。unstack()
示例stack()
示例frame.index.names
和 frame.columns.names
设置名称。Note
请注意,索引名称 “state” 和 “color” 不是行标签(frame.index
值)的一部分。
nlevels
属性类似于行索引,我们也可以选择列组:
swaplevel()
: 交换两个级别。sort_index()
: 使用索引级别对数据进行排序。可以按特定级别排序。swaplevel()
示例sort_index()
示例swaplevel()
和 sort_index()
组合Note
如果索引从最外层开始按字典顺序排序,则对分层索引对象进行数据选择的性能会更好。
许多描述性和汇总统计都有一个 level
选项:
set_index()
: 使用一个或多个列作为索引创建一个新的 DataFrame。reset_index()
: 将分层索引级别移动到列中(与 set_index()
相反)。set_index()
示例drop=False
来保留它们。set_index()
与 drop=False
reset_index()
示例reset_index()
将分层索引移动到列中。在 pandas 中合并数据的主要三种方法:
pandas.merge
: 基于键(类似于 SQL 连接)连接 DataFrame 中的行。pandas.concat
: 沿着轴连接或“堆叠”对象。combine_first
: 拼接重叠数据(填充缺失值)。pandas.merge
是连接操作的主要函数。pandas.merge
: 多对一连接(设置)pandas.merge
: 多对一连接(示例)df1
有多行标记为 ‘a’ 和 ‘b’。df2
在 ‘key’ 列中每个值只有一行。merge
将使用重叠的列名。最佳做法是显式指定。pandas.merge
: 不同的列名如果列名不同,请分别指定它们:
df3 = pd.DataFrame({"lkey": ["b", "b", "a", "c", "a", "a", "b"], # DataFrame 3,包含 "lkey" 列
"data1": pd.Series(range(7), dtype="Int64")}) # 和 "data1" 列
df4 = pd.DataFrame({"rkey": ["a", "b", "d"], # DataFrame 4,包含 "rkey" 列
"data2": pd.Series(range(3), dtype="Int64")}) # 和 "data2" 列
pd.merge(df3, df4, left_on="lkey", right_on="rkey") # 使用 "lkey" 和 "rkey" 作为连接键
left_on
: 左侧 DataFrame 中的列。right_on
: 右侧 DataFrame 中的列。pandas.merge
: 连接类型merge
执行 “inner” 连接(键的交集)。pandas.merge
: 外连接示例how
参数的连接类型选项 | 行为 |
---|---|
how="inner" |
仅使用两个表中都存在的键组合 |
how="left" |
使用左侧表中的所有键组合 |
how="right" |
使用右侧表中的所有键组合 |
how="outer" |
使用两个表中一起存在的所有键组合 |
pandas.merge
: 多对多连接df1
中有三个 “b” 行,df2
中有两个,因此结果中有六个 “b” 行。传递一个列名列表:
left = pd.DataFrame({"key1": ["foo", "foo", "bar"], # 左侧 DataFrame
"key2": ["one", "two", "one"],
"lval": pd.Series([1, 2, 3], dtype='Int64')})
right = pd.DataFrame({"key1": ["foo", "foo", "bar", "bar"], # 右侧 DataFrame
"key2": ["one", "one", "one", "two"],
"rval": pd.Series([4, 5, 6, 7], dtype='Int64')})
pd.merge(left, right, on=["key1", "key2"], how="outer") # 使用 "key1" 和 "key2" 作为连接键,执行外连接
merge
有一个 suffixes
选项来处理重叠的列名。suffixes
pandas.merge
函数参数参数 | 描述 |
---|---|
left |
左侧要合并的 DataFrame。 |
right |
右侧要合并的 DataFrame。 |
how |
连接类型:“inner”, “outer”, “left”, 或 “right”(默认为 “inner”)。 |
on |
要连接的列名(必须在两个 DataFrame 中都存在)。 |
left_on |
左侧 DataFrame 中用作连接键的列。 |
right_on |
类似于 left_on ,用于右侧 DataFrame。 |
left_index |
使用左侧 DataFrame 的行索引作为其连接键。 |
right_index |
类似于 left_index 。 |
sort |
按连接键对合并后的数据进行字典排序(默认为 False)。 |
suffixes |
要附加到重叠列名的字符串元组(默认为 (“_x”, “_y”))。 |
copy |
如果为 False,则在某些情况下避免复制数据(默认为复制)。 |
validate |
检查合并的类型(一对一,一对多,多对多) |
indicator |
添加名为 _merge 的列,指示每行的来源(“left_only”, “right_only”, “both”)。 |
left_index=True
或 right_index=True
(或两者)来基于索引合并。left1
的 “key” 列与 right1
的索引合并。left1
的索引会被保留。对于分层索引,基于索引连接类似于多键合并:
lefth = pd.DataFrame({"key1": ["Ohio", "Ohio", "Ohio",
"Nevada", "Nevada"], # 左侧 DataFrame
"key2": [2000, 2001, 2002, 2001, 2002],
"data": pd.Series(range(5), dtype="Int64")})
righth_index = pd.MultiIndex.from_arrays([ # 右侧 DataFrame 的 MultiIndex
["Nevada", "Nevada", "Ohio", "Ohio", "Ohio", "Ohio"],
[2001, 2000, 2000, 2000, 2001, 2002]
])
righth = pd.DataFrame({"event1": pd.Series([0, 2, 4, 6, 8, 10], dtype="Int64",
index=righth_index), # 使用 MultiIndex
"event2": pd.Series([1, 3, 5, 7, 9, 11], dtype="Int64",
index=righth_index)})
pd.merge(lefth, righth, left_on=["key1", "key2"], right_index=True, how="outer") # 基于多个列和索引合并
join
方法left2 = pd.DataFrame([[1., 2.], [3., 4.], [5., 6.]],
index=["a", "c", "e"], # 左侧 DataFrame
columns=["Ohio", "Nevada"]).astype("Int64")
right2 = pd.DataFrame([[7., 8.], [9., 10.], [11., 12.], [13, 14]],
index=["b", "c", "d", "e"], # 右侧 DataFrame
columns=["Missouri", "Alabama"]).astype("Int64")
left2.join(right2, how="outer") # 基于索引连接
join
基于列numpy.concatenate
: 适用于 NumPy 数组。pandas.concat
: 解决以下问题:
pandas.concat
与 Seriesconcat
沿着 axis="index"
(行)工作,生成另一个 Series。pandas.concat
: axis="columns"
axis="columns"
生成一个 DataFrame。pandas.concat
: join="inner"
join="inner"
对索引执行交集。pandas.concat
: keys
参数unstack()
结果keys
创建一个分层索引。标识连接的块。axis="columns"
连接时,keys
成为 DataFrame 列标题。pandas.concat
与 DataFrame逻辑与 Series 相同:
df1 = pd.DataFrame(np.arange(6).reshape(3, 2), index=["a", "b", "c"], # DataFrame 1
columns=["one", "two"])
df2 = pd.DataFrame(5 + np.arange(4).reshape(2, 2), index=["a", "c"], # DataFrame 2
columns=["three", "four"])
pd.concat([df1, df2], axis="columns", keys=["level1", "level2"]) # 沿着列连接,并使用 keys 作为列标题
names
参数命名创建的轴级别。ignore_index=True
。pandas.concat
函数参数参数 | 描述 |
---|---|
objs |
要连接的 pandas 对象列表或字典(必需)。 |
axis |
要连接的轴(默认为 “index”)。 |
join |
“inner” 或 “outer”(默认为 “outer”)。 |
keys |
与要连接的对象关联的值,形成一个分层索引。 |
levels |
用作分层索引级别的特定索引。 |
names |
创建的分层级别的名称。 |
verify_integrity |
检查新轴是否有重复项,如果有则引发异常(默认为 False)。 |
ignore_index |
不保留索引;生成一个新的 range(total_length) 索引。 |
numpy.where
: 执行面向数组的 if-else 操作。Series.combine_first
Series.combine_first
: 按索引对齐值并“修补”缺失数据。combine_first
按索引对齐(与 np.where
不同)。combine_first
与 DataFramecombine_first
逐列工作。stack
: 将列“旋转”或透视到行。unstack
: 将行透视到列。stack
和 unstack
: 示例 DataFramestack
示例unstack
示例unstack
与不同的级别dropna=False
unstack
在 DataFrame 中 unstacking 时,unstacked 的级别将成为最低级别。
unstack
和 stack
示例data = pd.read_csv("examples/macrodata.csv") # 从 CSV 文件读取数据
data = data.loc[:, ["year", "quarter", "realgdp", "infl", "unemp"]] # 选择特定的列
periods = pd.PeriodIndex(year=data.pop("year"), # 创建一个 PeriodIndex
quarter=data.pop("quarter"),
name="date")
data.index = periods.to_timestamp("D") # 将 PeriodIndex 转换为 Timestamp,并设置为索引
data = data.reindex(columns=["realgdp", "infl", "unemp"]) # 重新设置列的顺序
data.columns.name = "item" # 设置列索引的名称
long_data = (data.stack() # 将 DataFrame 转换为 Series
.reset_index() # 重置索引
.rename(columns={0: "value"})) # 重命名列
long_data[:10] # 显示前 10 行
pivot
方法pivot
方法将长格式转换为宽格式。
index
: 用作行索引的列。columns
: 用于创建新列的列。values
: 用于填充 DataFrame 的列。values
参数,则会得到分层列。pivot
等价于…pivot
等价于使用 set_index
后跟 unstack
:
pandas.melt
: pivot
的逆操作。将多列合并为一列(更长的 DataFrame)。id_vars
: 组指示器列。value_vars
: 要“取消透视”的列。如果未指定,则使用所有其他列。pandas.melt
示例melt
和 pivot
重塑pivot
可以重塑回原始布局。pivot
会创建一个索引,因此 reset_index()
可能很有用。merge
(数据库风格的连接)。concat
(沿轴连接)。combine_first
(修补缺失数据)。stack
和 unstack
(重塑)。pivot
(长格式到宽格式)。melt
(宽格式到长格式)。merge
而不是 concat
,反之亦然?邱飞 💌 [email protected]