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

【Python数据分析】40.数据规整——联合与合并数据1(数据库风格的DataFrame连接)


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

  • 可以在以下网站查看,该网站是使用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》翻译整理

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

包含在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”


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments