「目录」
数据规整:聚合、合并和重塑
Data Wrangling: Join, Combine, and Reshape
8.1 => 层次化索引 8.2 => 合并数据集
--------> 数据库风格的DataFrame合并
--------> 索引上的合并
8.3 => 重塑和轴向旋转
索引上的合并
上一篇笔记讲的是如何根据DataFrame的列名来链接两个DataFrame对象。
有时候我们要根据DataFrame中的index索引来合并数据。这种情况下,我们可以传入left_index=True或right_index=True或两个都传入来说明索引被用作链接键。
我们先创建两个DataFrame,指明根据第一个DataFrame的'key'列和第二个DataFrame的index索引来合并数据:
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: left1 = pd.DataFrame({'key':['a', 'b', 'a', 'a', 'b', 'c'], 'value':range(6)})
In [4]: right1 = pd.DataFrame({'group_val':[3.5, 7]}, index=['a', 'b'])
In [5]: left1
Out[5]:
key value
0 a 0
1 b 1
2 a 2
3 a 3
4 b 4
5 c 5
In [6]: right1
Out[6]:
group_val
a 3.5
b 7.0
In [7]: pd.merge(left1, right1, left_on='key', right_index=True)
Out[7]:
key value group_val
0 a 0 3.5
2 a 2 3.5
3 a 3 3.5
1 b 1 7.0
4 b 4 7.0复制
默认的merge方法是求取链接键的交集,通过传入how='outer'可以得到它们的并集:
In [8]: pd.merge(left1, right1, left_on='key', right_index=True, how='outer')
Out[8]:
key value group_val
0 a 0 3.5
2 a 2 3.5
3 a 3 3.5
1 b 1 7.0
4 b 4 7.0
5 c 5 NaN复制
层次化索引数据的合并
对于层次化索引的数据的合并,我们要以列表的形式指明用作合并键的多个列。
In [9]: lefth = pd.DataFrame({'key1':['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'key2':[2000, 2001, 2002, 2001, 2002], 'data':np.arange(5.)})
In [14]: righth = pd.DataFrame(np.arange(12).reshape((6,2)), index=[['Nevada', 'Nevada', 'Ohio', 'Ohio', 'Ohio', 'Ohio'], [2001, 2000, 2000, 2000, 2001, 2002]], columns=['event1', 'event2'])
In [15]: lefth
Out[15]:
key1 key2 data
0 Ohio 2000 0.0
1 Ohio 2001 1.0
2 Ohio 2002 2.0
3 Nevada 2001 3.0
4 Nevada 2002 4.0
In [16]: righth
Out[16]:
event1 event2
Nevada 2001 0 1
2000 2 3
Ohio 2000 4 5
2000 6 7
2001 8 9
2002 10 11
复制
比如下面我们就指定根据第一个DataFrame的'key1'列和'key2'列以及第二个DataFrame的index索引来合并:
In [17]: pd.merge(lefth, righth, left_on=['key1', 'key2'], right_index=True)
Out[17]:
key1 key2 data event1 event2
0 Ohio 2000 0.0 4 5
0 Ohio 2000 0.0 6 7
1 Ohio 2001 1.0 8 9
2 Ohio 2002 2.0 10 11
3 Nevada 2001 3.0 0 1
In [18]: pd.merge(lefth, righth, left_on=['key1', 'key2'], right_index=True, how='outer')
Out[18]:
key1 key2 data event1 event2
0 Ohio 2000 0.0 4.0 5.0
0 Ohio 2000 0.0 6.0 7.0
1 Ohio 2001 1.0 8.0 9.0
2 Ohio 2002 2.0 10.0 11.0
3 Nevada 2001 3.0 0.0 1.0
4 Nevada 2002 4.0 NaN NaN
4 Nevada 2000 NaN 2.0 3.0复制
同时使用双方的索引来合并也没问题:
In [19]: left2 = pd.DataFrame([[1., 2.], [3., 4.], [5., 6.]], index=['a', 'c', 'e'], columns=['Ohio', 'Nevada'])
In [20]: right2 = pd.DataFrame([[7., 8.], [9., 10.], [11., 12.], [13, 14]], index=['b', 'c', 'd', 'e'], columns=['Missouri', 'Alabama'])
In [21]: left2
Out[21]:
Ohio Nevada
a 1.0 2.0
c 3.0 4.0
e 5.0 6.0
In [22]: right2
Out[22]:
Missouri Alabama
b 7.0 8.0
c 9.0 10.0
d 11.0 12.0
e 13.0 14.0
In [23]: pd.merge(left2, right2, how='outer', left_index=True, right_index=True)
Out[23]:
Ohio Nevada Missouri Alabama
a 1.0 2.0 NaN NaN
b NaN NaN 7.0 8.0
c 3.0 4.0 9.0 10.0
d NaN NaN 11.0 12.0
e 5.0 6.0 13.0 14.0复制
join方法
DataFrame还有便捷的实例方法join,它能更方便的实现按索引合并,但要求没有重叠的列。
In [24]: left2.join(right2, how='outer')
Out[24]:
Ohio Nevada Missouri Alabama
a 1.0 2.0 NaN NaN
b NaN NaN 7.0 8.0
c 3.0 4.0 9.0 10.0
d NaN NaN 11.0 12.0
e 5.0 6.0 13.0 14.0复制
我们还可以向join传入一组DataFrame,类似于concat函数,实现多个DataFrame的合并拼接:
In [25]: another = pd.DataFrame([[7.,8.], [9.,10.], [11., 12.], [16., 17.]], index=['a', 'c', 'e', 'f'], columns=['New York', 'Oregon'])
In [26]: another
Out[26]:
New York Oregon
a 7.0 8.0
c 9.0 10.0
e 11.0 12.0
f 16.0 17.0
In [27]: left2.join([right2, another])
Out[27]:
Ohio Nevada Missouri Alabama New York Oregon
a 1.0 2.0 NaN NaN 7.0 8.0
c 3.0 4.0 9.0 10.0 9.0 10.0
e 5.0 6.0 13.0 14.0 11.0 12.0
In [29]: left2.join([right2, another], how='outer')
Out[29]:
Ohio Nevada Missouri Alabama New York Oregon
a 1.0 2.0 NaN NaN 7.0 8.0
b NaN NaN 7.0 8.0 NaN NaN
c 3.0 4.0 9.0 10.0 9.0 10.0
d NaN NaN 11.0 12.0 NaN NaN
e 5.0 6.0 13.0 14.0 11.0 12.0
f NaN NaN NaN NaN 16.0 17.0复制
今天好困,眼睛都要睁不开了,就这样吧,BYE-BYE。
往期回顾



Stay hungry, stay foolish
文章转载自Yuan的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
[MYSQL] 服务器出现大量的TIME_WAIT, 每天凌晨就清零了
大大刺猬
143次阅读
2025-04-01 16:20:44
演讲实录|分布式 Python 计算服务 MaxFrame 介绍及场景应用方案
阿里云大数据AI技术
121次阅读
2025-03-17 13:27:37
mysql提升10倍count(*)的神器
大大刺猬
120次阅读
2025-03-21 16:54:21
官宣,Milvus SDK v2发布!原生异步接口、支持MCP、性能提升
ZILLIZ
96次阅读
2025-04-02 09:34:13
[MYSQL] query_id和STATEMENT_ID在不同OS上的关系
大大刺猬
64次阅读
2025-03-26 19:08:13
DataWorks :Data+AI 一体化开发实战图谱
阿里云大数据AI技术
46次阅读
2025-03-19 11:00:55
国密算法介绍
漫步者
44次阅读
2025-03-21 09:20:39
如何使用 RisingWave 和 PuppyGraph 构建高性能实时图分析框架
RisingWave中文开源社区
37次阅读
2025-03-18 10:49:54
WingPro for Mac 强大的Python开发工具 v10.0.9注册激活版
一梦江湖远
33次阅读
2025-03-29 10:33:27
python操作MySQL数据库
怀念和想念
29次阅读
2025-03-30 23:22:07