首页Python【Python数据分析】4...

【Python数据分析】42.数据规整——联合与合并数据3(沿轴向连接)


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————————————————–

另一种数据组合操作称为拼接或堆叠。Numpy的concatenate 函数可以在numpy数组上实现该功能。

 1>>> arr = np.arange(12).reshape((34))
2>>> arr
3array([[ 0,  1,  2,  3],
4       [ 4,  5,  6,  7],
5       [ 8,  9, 10, 11]]
)
6
7>>> np.concatenate([arr,arr],axis=1)
8array([[ 0,  1,  2,  3,  0,  1,  2,  3],
9       [ 4,  5,  6,  7,  4,  5,  6,  7],
10       [ 8,  9, 10, 11,  8,  9, 10, 11]]
)

Pandas中的concat函数提供了与Numpy类似的操作。

1.Series对象:

默认情况下,pandas.concat方法是沿着axis=”index”的轴生效。可以传递axis=”columns”,改变生效轴。

 1>>> s1 = pd.Series([012], index=["a""b""c"], dtype="Int64")
2>>> s2 = pd.Series([345], index=["c""d""e"], dtype="Int64")
3>>> s3 = pd.Series([67], index=["f""g"], dtype="Int64")
4
5>>> pd.concat([s1,s2,s3])
6a    0
7b    1
8c    2
9c    3
10d    4
11e    5
12f    6
13g    7
14dtype: Int64
15
16>>> pd.concat([s1,s2,s3],axis="columns")
17      0     1     2
18a     0  <NA>  <NA>
19b     1  <NA>  <NA>
20c     2     3  <NA>
21d  <NA>     4  <NA>
22e  <NA>     5  <NA>
23f  <NA>  <NA>     6
24g  <NA>  <NA>     7

可以看到上述操作的结果是全部索引的并集(外连接“outer”),可以通过传递join=”inner”来改变。

1>>> pd.concat([s1,s2],axis="columns",join="inner")
2   0  1
3c  2  3

一个潜在的问题是连接的各部分在结果中无法识别。假设你想在连接轴上创建分层索引,可以使用 keys参数。

在沿  axis="columns" 组合 Series 的情况下,keys成为 DataFrame 列头。

 1>>> pd.concat([s1,s2,s3],keys=["one","two","three"])
2one    a    0
3       b    1
4       c    2
5two    c    3
6       d    4
7       e    5
8three  f    6
9       g    7
10dtype: Int64
11
12>>> pd.concat([s1,s2,s3],axis="columns",keys=["one","two","three"])
13    one   two  three
14a     0  <NA>   <NA>
15b     1  <NA>   <NA>
16c     2     3   <NA>
17d  <NA>     4   <NA>
18e  <NA>     5   <NA>
19f  <NA>  <NA>      6
20g  <NA>  <NA>      7

2.DataFrame 对象:

将同样的逻辑扩展到DataFrame 对象中。keys参数将用于创建层次索引,其中第一级可用于标识每个串联的 DataFrame 对象。

 1>>> df1 = pd.DataFrame(np.arange(6).reshape(32), index=["a""b""c"],columns=["one""two"])
2>>> df1
3   one  two
4a    0    1
5b    2    3
6c    4    5
7
8>>> df2 = pd.DataFrame(5 + np.arange(4).reshape(22), index=["a""c"],columns=["three""four"])
9>>> df2
10   three  four
11a      5     6
12c      7     8
13
14>>> pd.concat([df1,df2],axis="columns",keys=["L1","L2"])
15   L1        L2
16  one two three four
17a   0   1   5.0  6.0
18b   2   3   NaN  NaN
19c   4   5   7.0  8.0

如果你传递一个字典对象而不是一个列表,字典的键将用于 keys 参数。

1>>> pd.concat({"L1":df1 , "L2":df2},axis="columns")
2   L1        L2
3  one two three four
4a   0   1   5.0  6.0
5b   2   3   NaN  NaN
6c   4   5   7.0  8.0

还有其他参数控制如何创建层次索引。例如,我们可以使用  names 参数命名创建的轴层级。

1>>> pd.concat([df1,df2],axis="columns",keys=["L1","L2"],names=["一","二"])
2一  L1        L2
3二 one two three four
4a   0   1   5.0  6.0
5b   2   3   NaN  NaN
6c   4   5   7.0  8.0

最后要考虑的是行索引不包含任何相关数据的 DataFrame。

在这种情况下,你可以传递  ignore_index=True,它会丢弃每个 DataFrame 中的索引并仅连接列中的数据,分配一个新的默认索引。

 1>>> df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=["a""b""c"])
2>>> df1
3   a  b  c
40  0  1  2
51  3  4  5
62  6  7  8
7
8>>> df2 = pd.DataFrame(np.arange(10,16).reshape((2,3)),columns=["b""d""a"])
9>>> df2
10    b   d   a
110  10  11  12
121  13  14  15
13
14>>> pd.concat([df1,df2])
15    a   b    c     d
160   0   1  2.0   NaN
171   3   4  5.0   NaN
182   6   7  8.0   NaN
190  12  10  NaN  11.0
201  15  13  NaN  14.0
21
22>>> pd.concat([df1,df2],ignore_index=True)
23    a   b    c     d
240   0   1  2.0   NaN
251   3   4  5.0   NaN
262   6   7  8.0   NaN
273  12  10  NaN  11.0
284  15  13  NaN  14.0

pandas.concat 函数的参数:

参数
说明
objs 需要连接的pandas对象列表或字典,是必选参数
axis 连接的轴,默认为沿行方向 (axis=”index”)
join 用于指定连接方式"inner" 或者"outer" (默认为"outer" )
keys 与要连接的对象关联的值,沿着连接轴形成分层索引,可以是任意值的列表或数组,也可以是元祖的数组,也可以是数组的列表(如果要向levels参数传入多层数组)
levels 在键值传递时,用于指定多层索引的层级
names 如果传入了keys and/or levels 参数,改参数用于指定多层索引的名称
verify_integrity 检查连接对象中的新轴是否重复,如果是,则发生异常;默认为False,允许重复
ignore_index 不沿着连接轴保留索引,而产生一段新的索引(range(total_length)


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments