pandas 第三节 (merge用法)

本文介绍了pandas库中用于数据融合的两个关键方法——merge和join。join操作基于行索引进行,要求列名不重复,返回结果包含df1的所有行,df2的列如果不存在则用NaN填充。而merge则更接近关系型数据库的操作,通过列索引进行关联。此外,还提到了pandas的分组功能。

df1

 

df2

join是按照行索引来关联操作,列名不能相同

df1.join(df2) #返回df1的行数,df1和df2的所有列名 值没有的话用NaN

merge是按照列索引来关联操作,和关系型数据库很相近

1. df1.merge(df2,on=0) #等价于df1.0=df2.0
    0  1_x   2   3   4  1_y
0  18   15  19  15  12   10
1  18   15  19  15  12   11
2  16   13  11  15  18   13
SELECT * FROM df1
JOIN df2 ON df1.[0]=df2.[0]
2. df1.merge(df2,left_on=3,right_on=0) #默认是inner
   0_x  1_x   2   3   4  0_y  1_y
0   11   18  12  18  14   18   10
1   11   18  12  18  14   18   11
SELECT * FROM df1
JOIN df2 ON df1.[3]=df2.[0]

3. df1.merge(df2,left_on=3,right_on=0,how="outer")
    0_x   1_x     2   3     4   0_y   1_y
0  18.0  15.0  19.0  15  12.0   NaN   NaN
1  16.0  13.0  11.0  15  18.0   NaN   NaN
2  10.0  16.0  15.0  14  16.0   NaN   NaN
3  11.0  18.0  12.0  18  14.0  18.0  10.0
4  11.0  18.0  12.0  18  14.0  18.0  11.0
5   NaN   NaN   NaN  19   NaN  19.0  10.0
6   NaN   NaN   NaN  16   NaN  16.0  13.0
SELECT * FROM df1 
FULL OUTER JOIN df2 on df1.[3]=df2.[0]

4. df1.merge(df2,left_on=3,right_on=0,how="left")
   0_x  1_x   2   3   4   0_y   1_y
0   18   15  19  15  12   NaN   NaN
1   10   16  15  14  16   NaN   NaN
2   11   18  12  18  14  18.0  10.0
3   11   18  12  18  14  18.0  11.0
4   16   13  11  15  18   NaN   NaN
SELECT * FROM df1 
LEFT JOIN df2 on df1.[3]=df2.[0]

5. df1.merge(df2,left_on=3,right_on=0,how="right")
    0_x   1_x     2    3     4   0_y   1_y
0   11.0  18.0   12.0   18   14.0   18   10
1   11.0  18.0   12.0   18   14.0   18   11
2   NaN   NaN   NaN  19   NaN   19   10
3   NaN   NaN   NaN  16   NaN   16   13
SELECT * FROM df1 
RIGHT JOIN df2 on df1.[3]=df2.[0]

 分组 group

grouped=df2.groupby([0]) #pandas.core.groupby.generic.DataFrameGroupBy

遍历分组
for i,j in grouped:
    print(type(i),type(j))
    print("$"*50)
    print(i)
    print("-"*50)
    print(j)
    print("*"*50

c=grouped.count()

select [0],count([1]),count([2]) 
from df2
group by [0]

 

### 使用 `pandas` 中 `df.merge()` 进行数据框合并的指南 `pandas` 提供了多种方法来合并和连接数据集,其中 `merge()` 是最常用的方法之一,用于根据一个或多个键将两个数据框(DataFrame)进行连接。`merge()` 的功能类似于 SQL 数据库中的 JOIN 操作,支持内连接、左连接、右连接和外连接等。 #### 基本语法 ```python pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, sort=False, suffixes=('_x', '_y')) ``` - **left**:左侧数据框。 - **right**:右侧数据框。 - **how**:指定连接方式,可选值为 `'inner'`(默认)、`'left'`、`'right'` 和 `'outer'`。 - **on**:用于连接的列名,必须是两个数据框中都存在的列。 - **left_on** 和 **right_on**:当两个数据框中用于连接的列名不同时,可以分别指定。 - **sort**:是否对结果进行排序,默认为 `False`。 - **suffixes**:如果两个数据框中存在相同列名,则会自动添加后缀 `_x` 和 `_y` 来区分。 #### 合并方式详解 1. **内连接(Inner Join)** 内连接只保留两个数据框中连接键(key)匹配的记录。这是默认的连接方式[^2]。 2. **左连接(Left Join)** 左连接保留左侧数据框中的所有记录,并将右侧数据框中匹配的记录合并进来,未匹配的部分用 `NaN` 填充[^2]。 3. **右连接(Right Join)** 右连接与左连接类似,但保留的是右侧数据框的所有记录[^2]。 4. **外连接(Outer Join)** 外连接保留两个数据框中的所有记录,未匹配的部分用 `NaN` 填充。 #### 示例代码 以下是一个使用 `merge()` 合并两个数据框的示例: ```python import pandas as pd import numpy as np # 创建第一个数据框 df1 df1 = pd.DataFrame(np.arange(12).reshape(3, 4), columns=['a', 'b', 'c', 'd']) print("df1:") print(df1) # 创建第二个数据框 df2 df2 = pd.DataFrame({'b': [1, 5], 'd': [3, 7], 'a': [0, 4]}) print("\ndf2:") print(df2) # 使用 merge() 合并 df1 和 df2 merged_df = pd.merge(df1, df2) print("\n合并后的结果:") print(merged_df) ``` 输出结果如下: ``` df1: a b c d 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 df2: b d a 0 1 3 0 1 5 7 4 合并后的结果: a b c d 0 0 1 2 3 1 4 5 6 7 ``` 在该示例中,`merge()` 根据共同列 `a`, `b`, `d` 将两个数据框进行了合并,合并后的列数等于两张表的列数之和减去连接键的数量(即 `4 + 3 - 3 = 4`)[^1]。 #### 注意事项 - 当两个数据框中有相同列名但不作为连接键时,`merge()` 会自动添加后缀 `_x` 和 `_y` 来区分这些列。 - 如果需要根据索引进行合并,可以设置 `left_index=True` 或 `right_index=True`。 - 若两个数据框的连接键名称不同,可以通过 `left_on` 和 `right_on` 参数分别指定[^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值