赞
踩
目录
数据分析中经常会遇到补行/列数据 或 数据拼接/合并的问题:
根据上述问题,本文总结了python中的表格拼接/合并函数的基本用法和使用效果:
- #建立数据表
- import numpy as np
- import pandas as pd
-
- df1 = pd.DataFrame({"id": ["01", "02", "03", "04"],
- "name": ["Alice", "Bruce", "Cook", "Daisy"],
- "school": ["AA", "BB", "CC", "AA"],
- "score": [85, 90, 75, 80]})
-
- df2 = pd.DataFrame({"id": ["01", "20"],
- "name": ["Alice", "Jason"],
- "school":["AA", "CC"],
- "score": [85, 88]})
-
- df1
- df2

df1和df2 表格的数据呈现如下图,特别注意这2个表格的第1行的数据是相同的
merge与concat不同,merge是根据两个表的具体连接字段来进行匹配合并,而concat是根据轴的具体方向进行合并不会有匹配过程。
pd.merge( left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None,)
merge(): 主要使用于表格的左右连接(横向合并)
left,rght参数
(参数名可省略不写)
left: 表示拼接后置于左边的表格;
right: 表示拼接后置于右边的表格
- df = pd.merge(left=df1, right=df2) # 或 df = pd.merge(df1,df2)
- df
表格连接的结果是返回了两个表格的“交集”,即两个表格中都存在的相同记录!这是因为merge的参数how,它的默认值为"inner"!也即内连接。
how参数
连接的方式,有4中选择:“left”, “right”, “inner”, “outer”, 默认值=”inner"
“inner”: 返回两个表格的交集
“outer”:返回两个表格的并集
① 设置how="inner"
- df = pd.merge(df1, df2, how="inner")
- df
由于how的默认值是"inner", 因此连接的结果与上面的一样!
② 设置how="outer"
- df = pd.merge(=df1, df2, how="outer")
- df
表格连接的结果:将两个表格中所有的数据,相同的数据只显示1次。相当于两个表格合并后去重。
③ 设置how="left" ---- 按照左边的表格进行数据合并
- df = pd.merge(df1, df2, how="left")
- df
④ 设置how="right" -- 按照右边的表格进行数据合并
- df = pd.merge(df1, df2, how="right")
- df
on参数
以哪一列作为连接列进行匹配连接,该列对应字段必须同时出现在两个dataframe中,如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
① 设置on=["id"]
- df = pd.merge(df1, df2, on=["id"], how="outer")
- df
② 设置on=["school"]
- df = pd.merge(df1, df2, on=["school"], how="outer")
- df
indicator参数
指示器,为布尔值,默认为False。
如果indicator为True,则向输出数据帧添加一个名为“_merge”的列,显示根据要求,每行数据在2个表格中匹配的情况,同一行两个表都不为NaN的显示both,同一行左表或右表为NaN的显示left_only或right_only。
① 设置indicator=True
- df = pd.merge(df1, df2, on=["school"], how="outer", indicator=True)
- df
sort参数
排序,根据连接字段进行升序,默认值为False
① 设置sort使用默认值 False
- df = pd.merge(df1, df2, on=["score"], how="outer")
- df
② 设置sort = True
- df = pd.merge(df1, df2, on=["score"], how="outer", sort=True)
- df
concat是”contatenate"的缩写,指的是多表之间的“拼接”。该函数能够沿指定轴执行连接操作,同时对其他轴上的索引(如果有的话,Series 只有一个轴)执行可选的集合运算(并集或交集)
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True,)
参数axis=0:数据的向下拼接
重复数据不会去重, 常用于数据(记录)的汇总合并,相当于SQL中的union all
- df = pd.concat([df1, df2], axis=0)
- df
df1和df2是直接进行上下连接 – 常用于数据(记录)的汇总合并,相当于SQL中的union all
参数axis=1:数据的左右拼接
参数 join的默认值=“outer”, 因此下列2行代码的结果是一样的。
- df = pd.concat([df1, df2], axis=1)
- # df = pd.concat([df1, df2], axis=1, join="outer")
- df
小结:
对比结果,pd.concat() 适用于数据表(DataFrame)的上下连接,而对于表格的左右连接,pd.merge() 会更好一些。
append是series和dataframe的方法,使用它就是默认沿着列进行拼接,append可以视作axis=0的简便版concat。也就是说,它只支持上下的行拼接,同时比concat简便一些。这里要注意和concat的用法区别。concat是pd的属性,所以调用的时候应该是pd.concat((df1,df2)),而append是对DataFrame的方法,所以调用的时候是DataFrame.append(df2)
只能使用于表格的上下连接,表格的上下位置顺序取决于哪一个表格放在前面。
x=df.append(other, ignore_index=False, verify_integrity=False, sort=None)
在表格df1后面连接表格df2:
- df = df1.append(df2)
- df
DataFrame内置的join方法是一种快速合并的方法,join操作是一个同merge相似的操作。join()默认是两个DataFrame之间进行Index的关联合并,当然也可以指定普通的列column和index之间进行混合合并:join也可以被理解为merge的一个简便并且特殊的方法。join也可以设置参数"how",只不过这里默认值不同。Merge中,how的默认值是”inner“,join中的默认值为”left"。
df=DataFrame.join(obj, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False,validate="one_to_one")
① Index-Index的关联合并
result = left.join(right)
② Column-Index的混合关联合并
result = left.join(right, on='key')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。