本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接: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》翻译整理
—————————————————–
包含在Panda对象的数据可以通过多种方式组合在一起:
pandas.merge ——基于一个或多个键连接 DataFrame 中的行。SQL 或其他关系数据库的用户会很熟悉,它实现的是数据库的连接操作。
pandas.concat ——沿轴将对象连接或“堆叠”在一起。
combine_first ——将重叠数据拼接在一起,使用一个对象的值填充另一个对象中的缺失值。
1.数据库风格的DataFrame连接:
合并或连接操作通过使用一个或多个键连接行来合并数据集。这些操作在关系数据库中尤为重要(例如,基于 SQL的数据库)。
Pandas 中的 pandas.merge
函数是对数据进行上述操作的主要方法。
使用pd.merge()
方法时,如果没有指定连接的键的信息,系统会自动选择重叠的列名作为连接的键,不过显式的指定连接键是一个好习惯。
1>>> df1 = pd.DataFrame({'user_id':[1,2,3,4,5,6,7],'device':['Iphone','Huawei','HTC','oppo','vivo','xiaomi','google']})
2>>> df1
3 user_id device
40 1 Iphone
51 2 Huawei
62 3 HTC
73 4 oppo
84 5 vivo
95 6 xiaomi
106 7 google
11
12>>> df2 = pd.DataFrame({'user_id':[1,2,3,4,5,6,8],'month_G':[5,9,8,10,15,30,2]})
13>>> df2
14 user_id month_G
150 1 5
161 2 9
172 3 8
183 4 10
194 5 15
205 6 30
216 8 2
22
23>>> pd.merge(df1,df2,on='user_id')
24 user_id device month_G
250 1 Iphone 5
261 2 Huawei 9
272 3 HTC 8
283 4 oppo 10
294 5 vivo 15
305 6 xiaomi 30
因为日常数据中很多会存在连接键名不一致的情况,此时就需要我们分别指定连接键。
1>>> df1 = pd.DataFrame({'user_id':[1,2,3,4,5,6,7],'device':['Iphone7','Huawei','HTC','oppo','vivo','xiaomi','google']})
2>>> df1
3 user_id device
40 1 Iphone7
51 2 Huawei
62 3 HTC
73 4 oppo
84 5 vivo
95 6 xiaomi
106 7 google
11
12>>> df2 = pd.DataFrame({'id':[1,2,3,4,5,6,8],'month_G':[5,9,8,10,15,30,2]})
13>>> df2
14 id month_G
150 1 5
161 2 9
172 3 8
183 4 10
194 5 15
205 6 30
216 8 2
22
23>>> pd.merge(df1,df2,left_on='user_id',right_on='id')
24 user_id device id month_G
250 1 Iphone7 1 5
261 2 Huawei 2 9
272 3 HTC 3 8
283 4 oppo 4 10
294 5 vivo 5 15
305 6 xiaomi 6 30
默认情况下,系统做的是内连接,也就是取两个数据的交集,可以通过指定连接模式达到所需效果。inner
为内连接,outer
为外连接,left
为使用左表的键进行连接,right
为使用右表的键进行连接。
1>>> df1 = pd.DataFrame({'user_id':[1,2,3,4,5,6,7],'device':['Iphone7','Huawei','HTC','oppo','vivo','xiaomi','google']})
2>>> df1
3 user_id device
40 1 Iphone7
51 2 Huawei
62 3 HTC
73 4 oppo
84 5 vivo
95 6 xiaomi
106 7 google
11
12>>> df2 = pd.DataFrame({'user_id':[1,2,3,4,5,6,8],'month_G':[5,9,8,10,15,30,2]})
13>>> df2
14 user_id month_G
150 1 5
161 2 9
172 3 8
183 4 10
194 5 15
205 6 30
216 8 2
22
23>>> pd.merge(df1,df2,how='outer')
24 user_id device month_G
250 1 Iphone7 5.0
261 2 Huawei 9.0
272 3 HTC 8.0
283 4 oppo 10.0
294 5 vivo 15.0
305 6 xiaomi 30.0
316 7 google NaN
327 8 NaN 2.0
33
34>>> pd.merge(df1,df2,how='left')
35 user_id device month_G
360 1 Iphone7 5.0
371 2 Huawei 9.0
382 3 HTC 8.0
393 4 oppo 10.0
404 5 vivo 15.0
415 6 xiaomi 30.0
426 7 google NaN
how参数的不同连接类型:
选项 |
说明 |
how=”inner” | 使用两个表的键的交集进行联合 |
how=”left” | 使用左表中的键进行联合 |
how=”right” | 使用右表中的键进行联合 |
how=”outer” | 使用两个表的键的并集进行联合 |
当使用多个键进行连接时,需要传入一个键名的列表。
1>>> df1 = pd.DataFrame({'user_id':[1,2,3,4,5,6,7],'device':['Iphone','Huawei','HTC','oppo','vivo','xiaomi','google'],'key':['shandong','shanghai','beijing','hebei','jiangsu','hunan','henan']})
2>>> df1
3 user_id device key
40 1 Iphone shandong
51 2 Huawei shanghai
62 3 HTC beijing
73 4 oppo hebei
84 5 vivo jiangsu
95 6 xiaomi hunan
106 7 google henan
11
12>>> df2 = pd.DataFrame({'user_id':[1,2,3,4,5,6,8],'month_G':[5,9,8,10,15,30,2],'key':['shandong','shanghai','beijing','hebei','jiangsu','hunan','jiangxi']})
13>>> df2
14 user_id month_G key
150 1 5 shandong
161 2 9 shanghai
172 3 8 beijing
183 4 10 hebei
194 5 15 jiangsu
205 6 30 hunan
216 8 2 jiangxi
22
23>>> pd.merge(df1,df2,on=['user_id','key'],how='outer')
24 user_id device key month_G
250 1 Iphone shandong 5.0
261 2 Huawei shanghai 9.0
272 3 HTC beijing 8.0
283 4 oppo hebei 10.0
294 5 vivo jiangsu 15.0
305 6 xiaomi hunan 30.0
316 7 google henan NaN
327 8 NaN jiangxi 2.0
合并操作中要考虑的一个问题是重叠列名的处理。
虽然可以手动解决重叠问题(重命名轴标签),但 pandas.merge
有一个suffixes
参数选项,用于指定要附加到左右 DataFrame 对象中重叠名称的字符串前缀。
1>>> df1 = pd.DataFrame({'user_id':[1,2,3,4,5,6,7],'device':['Iphone','Huawei','HTC','oppo','vivo','xiaomi','google'],'key':['shandong','shanghai','beijing','hebei','jiangsu','hunan','henan']})
2>>> df1
3 user_id device key
40 1 Iphone shandong
51 2 Huawei shanghai
62 3 HTC beijing
73 4 oppo hebei
84 5 vivo jiangsu
95 6 xiaomi hunan
106 7 google henan
11
12>>> df2 = pd.DataFrame({'user_id':[1,2,3,4,5,6,8],'month_G':[5,9,8,10,15,30,2],'key':['ios','shanghai','beijing','hebei','jiangsu','hunan','jiangxi']})
13>>> df2
14 user_id month_G key
150 1 5 ios
161 2 9 shanghai
172 3 8 beijing
183 4 10 hebei
194 5 15 jiangsu
205 6 30 hunan
216 8 2 jiangxi
22
23>>> pd.merge(df1,df2,on=['user_id'],how='outer')
24 user_id device key_x month_G key_y
250 1 Iphone shandong 5.0 ios
261 2 Huawei shanghai 9.0 shanghai
272 3 HTC beijing 8.0 beijing
283 4 oppo hebei 10.0 hebei
294 5 vivo jiangsu 15.0 jiangsu
305 6 xiaomi hunan 30.0 hunan
316 7 google henan NaN NaN
327 8 NaN NaN 2.0 jiangxi
33
34# suffixes参数选项
35>>> pd.merge(df1,df2,on=['user_id'],how='outer',suffixes=["_df1","_df2"])
36 user_id device key_df1 month_G key_df2
370 1 Iphone shandong 5.0 ios
381 2 Huawei shanghai 9.0 shanghai
392 3 HTC beijing 8.0 beijing
403 4 oppo hebei 10.0 hebei
414 5 vivo jiangsu 15.0 jiangsu
425 6 xiaomi hunan 30.0 hunan
436 7 google henan NaN NaN
447 8 NaN NaN 2.0 jiangxi
pandas.merge函数的参数列表:
参数 |
说明 |
left | 合并操作时左边的DataFrame |
right | 合并操作时右边的DataFrame |
how | 连接类型, 包括"inner" , "outer" , "left" , or "right" ; d默认为"inner" |
on | 连接的列名。必须是在两个DataFrame中都有的列名 |
left_on | 左侧DataFrame 用作连接的列名 |
right_on | 右侧DataFrame 用作连接的列名 |
left_index | 使用左边的行索引作为连接键(如果是 MultiIndex,则是多个键) |
right_index | 使用右边的行索引作为连接键(如果是 MultiIndex,则是多个键) |
sort | 通过连接键按字母顺序对合并后的数据进行排序;默认为False |
suffixes | 在重叠的情况下追加到列名的字符串元组;默认为 (“_x”, “_y”)(例如,如果两个 DataFrame 对象中的 “data” 将在结果中显示为 “data_x” 和 “data_y”) |
copy | 如果为 False,则避免在某些异常情况下将数据复制到结果数据结构中;默认总是复制 |
validate | 验证合并是否属于指定类型,是一对一、一对多还是多对多。有关选项的完整详细信息,请参阅文档字符串 |
indicator | 添加一个特殊的列 _merge 来指示每一行的来源;根据每行中连接数据的来源,值将是“left_only”、“right_only”或“both” |
本篇文章来源于微信公众号: 码农设计师