深度整理: 超详细 Pandas 合并数据集操作总结(深度整理1.4g解压密码已解决)

网友投稿 577 2022-09-06


深度整理: 超详细 Pandas 合并数据集操作总结(深度整理1.4g解压密码已解决)

关于如果用​​pandas​​库来实现数据集之间合并的文章其实说少也不算少,不过我总是感觉写的算不上完善,尤其针对Python初学者来说,所以今天打算来整理与总结一下,内容较多建议收藏,喜欢点赞支持,文末提供技术交流群。

本文大概的结构是

​​concat()​​方法的简单介绍​​append()​​方法的简单介绍​​merge()​​方法的简单介绍​​join()​​方法的简单介绍多重行索引的合并介绍表格合并之后的列名重命名​​combine()​​方法的简单介绍​​combine_first()​​方法的简单介绍

​​Concat()​​方法的简单介绍

在我们开始​​concat()​​方法的正是介绍之前,我们先来看一下简单的例子

df1 = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], }, index=[0, 1, 2, 3],)df2 = pd.DataFrame( { "A": ["A4", "A5", "A6", "A7"], "B": ["B4", "B5", "B6", "B7"], "C": ["C4", "C5", "C6", "C7"], "D": ["D4", "D5", "D6", "D7"], }, index=[4, 5, 6, 7],)df3 = pd.DataFrame( { "A": ["A8", "A9", "A10", "A11"], "B": ["B8", "B9", "B10", "B11"], "C": ["C8", "C9", "C10", "C11"], "D": ["D8", "D9", "D10", "D11"], }, index=[8, 9, 10, 11],)

我们来看一下使用​​concat()​​方法之后的效果

frames = [df1, df2, df3]result = pd.concat(frames)result

output

A B C D0 A0 B0 C0 D01 A1 B1 C1 D12 A2 B2 C2 D23 A3 B3 C3 D34 A4 B4 C4 D45 A5 B5 C5 D56 A6 B6 C6 D67 A7 B7 C7 D78 A8 B8 C8 D89 A9 B9 C9 D910 A10 B10 C10 D1011 A11 B11 C11 D11

大致合并的方向就是按照轴垂直的方向来进行合并,如下图

下面小编来详细介绍一下​​concat()​​方法中的各个参数作用

pd.concat( objs, axis=0, join="outer", ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True,)

objs:需要用来进行合并的数据集,可以是Series类型或者是DataFrame类型的数据axis:可以理解为是合并的方向,默认是0join:可以理解为是合并的方式,有并集或是交集两种方式,默认的是并集ignore_index:忽略索引,默认是​​False​​keys:用于做行方向的多重索引

大家可能会有些迷惑,什么是多重的索引呢?看下面的例子

result = pd.concat(frames, keys=["x", "y", "z"])result

output

如此一来,我们可以通过“x”、“y”以及“z”这些元素来获取每一部分的数据,例如

result.log["x"]

output

A B C D0 A0 B0 C0 D01 A1 B1 C1 D12 A2 B2 C2 D23 A3 B3 C3 D3

除此之外,​​keys​​参数还能够被用在列索引上

s3 = pd.Series([0, 1, 2, 3], name="foo")s4 = pd.Series([0, 1, 2, 3])s5 = pd.Series([0, 1, 4, 5])pd.concat([s3, s4, s5], axis=1, keys=["red", "blue", "yellow"])

output

red blue yellow0 0 0 01 1 1 12 2 2 43 3 3 5

列名就变成了​​keys​​列表中的元素

而对于​​join​​​参数,默认的是以​​outer​​也就是并集的方式在进行两表格的合并

df4 = pd.DataFrame( { "B": ["B2", "B3", "B6", "B7"], "D": ["D2", "D3", "D6", "D7"], "F": ["F2", "F3", "F6", "F7"], }, index=[2, 3, 6, 7],)result = pd.concat([df1, df4], axis=1)

output

而当我们将​​join​​​参数设置成​​inner​​,也就是交集的方式来进行合并,出来的结果就会不太一样

result = pd.concat([df1, df4], axis=1, join="inner")

output

接下来我们来看一下​​ignore_index​​参数的作用,它能够对行索引做一个重新的整合

result = pd.concat([df1, df4], ignore_index=True, sort=False)

output

对于一个表格是​​DataFrame​​​格式,另外一个是​​Series​​​格式,​​concat()​​方法也可以将两者合并起来,

s1 = pd.Series(["X0", "X1", "X2", "X3"], name="X")result = pd.concat([df1, s1], axis=1)

output

要是在加上​​ignore_index​​参数的话,看一下效果会如何

result = pd.concat([df1, s1], axis=1, ignore_index=True)

output

​​append()​​方法的简单介绍

​​append()​​​方法是对上面​​concat()​​方法的简单概括,我们来看一下简单的例子

result = df1.append(df2)result

output

当然​​append()​​方法当中也可以放入多个DataFrame表格,代码如下

result = df1.append([df2, df3])

output

和上面的​​concat()​​​方法相类似的是,​​append()​​​方法中也有​​ignore_index​​参数,

result = df1.append(df4, ignore_index=True, sort=False)

output

同样地,我们也可以通过​​append()​​方法来给DataFrame表格添加几行的数据

s2 = pd.Series(["X0", "X1", "X2", "X3"], index=["A", "B", "C", "D"])result = df1.append(s2, ignore_index=True)

output

关于​​Merge()​​方法的介绍

在​​merge()​​方法中有这些参数

pd.merge( left, right, how="inner", on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=("_x", "_y"), copy=True, indicator=False, validate=None,)

left/right:也就是所要合并的两个表格on:左右所要合并的两表格的共同列名left_on/right_on:两表格进行合并时所对应的字段how:合并的方式,有left、right、outer、inner四种,默认是innersuffixes:在两表格进行合并时,重复的列名后面添加的后缀left_index:若为True,按照左表格的索引来连接两个数据集right_index:若为True,按照右表格的索引来连接两个数据集

我们先来看一个简单的例子

left = pd.DataFrame( { "key": ["K0", "K1", "K2", "K3"], "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], })right = pd.DataFrame( { "key": ["K0", "K1", "K2", "K3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], })result = pd.merge(left, right, on="key")result

output

在​​merge()​​​的过程当中有三种类型的合并,分别是一对一、多对一、多对多。其中“一对一”类型也就是​​merge()​​方法会去寻找两个表格当中相同的列,例如上面的“key”,并自动以这列作为键来进行排序,需要注意的是共同列中的元素其位置可以是不一致的。

那么来看一下“多对一”的合并类型,例如下面两张表格有共同的列“group”,并且第一张表格当中的“group”有两个相同的值,

df1:employee group hire_date0 Bob Accounting 20081 Jake Engineering 20022 Mike Engineering 20053 Linda HR 2010df2: group supervisor0 Accounting Cathey1 Engineering Dylan2 HR James

然后我们来进行合并

pd.merge(df_1, df_2)

output

employee group hire_date supervisor0 Bob Accounting 2008 Cathey1 Jake Engineering 2002 Dylan2 Mike Engineering 2005 Dylan3 Linda HR 2010 James

最后便是“多对多”的合并类型,可以理解为两张表格的共同列中都存在着重复值,例如

df3:employee group0 Bob Accounting1 Jake Engineering2 Lisa Engineering3 Sue HRdf4: group skills0 Accounting math1 Accounting spreadsheets2 Engineering coding3 Engineering linux4 HR spreadsheets5 HR organization

然后我们进行合并之后,看一下出来的结果

df = pd.merge(df3, df4)print(df)

output

employee group skills0 Bob Accounting math1 Bob Accounting programming2 Jake Engineering linux3 Jake Engineering python4 Lisa Engineering linux5 Lisa Engineering python6 Sue HR java7 Sue HR c++

那么涉及到参数​​how​​有四种合并的方式,有“left”、“right”、“inner”、“outer”,分别代表

inner:也就是交集,在使用​​merge()​​方法的时候,默认采用的都是交集的合并方式outer:可以理解为是并集的合并方式left/right: 单方向的进行并集的合并

我们先来看一下“left”方向的并集的合并

result = pd.merge(left, right, how="left", on=["key1", "key2"])result

output

我们再来看一下“right”方向的并集的合并

result = pd.merge(left, right, how="right", on=["key1", "key2"])result

output

“outer”方式的合并

result = pd.merge(left, right, how="outer", on=["key1", "key2"])result

output

“inner”方式的合并

result = pd.merge(left, right, how="inner", on=["key1", "key2"])result

output

关于​​join()​​方法的简单介绍

​​join()​​方法用于将两个有着不同列索引的表格合并到一起,我们先来看一个简单的例子

left = pd.DataFrame( {"A": ["A0", "A1", "A2"], "B": ["B0", "B1", "B2"]}, index=["K0", "K1", "K2"])right = pd.DataFrame( {"C": ["C0", "C2", "C3"], "D": ["D0", "D2", "D3"]}, index=["K0", "K2", "K3"])result = left.join(right)

output

在​​join()​​​方法中也有参数​​how​​​用来定义合并的方式,和​​merge()​​方法相类似,这里便也有不做赘述

当多重行索引遇到​​join()​​方法

当遇到一表格,其中的行索引是多重行索引的时候,例如

left = pd.DataFrame( {"A": ["A0", "A1", "A2"], "B": ["B0", "B1", "B2"]}, index=pd.Index(["K0", "K1", "K2"], name="key"),)index = pd.MultiIndex.from_tuples( [("K0", "Y0"), ("K1", "Y1"), ("K2", "Y2"), ("K2", "Y3")], names=["key", "Y"],)right = pd.DataFrame( {"C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"]}, index=index,)result = left.join(right, how="inner")

output

那么要是要合并的两张表格都是多重行索引呢?

leftindex = pd.MultiIndex.from_product( [list("abc"), list("xy"), [1, 2]], names=["abc", "xy", "num"])left = pd.DataFrame({"v1": range(12)}, index=leftindex)

output

v1abc xy num a x 1 0 2 1 y 1 2 2 3b x 1 4 2 5 y 1 6 2 7c x 1 8 2 9 y 1 10 2 11

第二张表格如下

rightindex = pd.MultiIndex.from_product( [list("abc"), list("xy")], names=["abc", "xy"])right = pd.DataFrame({"v2": [100 * i for i in range(1, 7)]}, index=rightindex)

output

v2abc xy a x 100 y 200b x 300 y 400c x 500 y 600

将上述的两张表格进行合并

left.join(right, on=["abc", "xy"], how="inner")

output

v1 v2abc xy num a x 1 0 100 2 1 100 y 1 2 200 2 3 200b x 1 4 300 2 5 300 y 1 6 400 2 7 400c x 1 8 500 2 9 500 y 1 10 600 2 11 600

列名的重命名

要是两张表格的列名相同,合并之后会对其列名进行重新命名,例如

left = pd.DataFrame({"k": ["K0", "K1", "K2"], "v": [1, 2, 3]})right = pd.DataFrame({"k": ["K0", "K0", "K3"], "v": [4, 5, 6]})result = pd.merge(left, right, on="k")

output

这里就不得不提到​​suffixes​​这个参数,通过这个参数来个列进行重命名,例如

result = pd.merge(left, right, on="k", suffixes=("_l", "_r"))

output

​​combine_first()​​方法的简单介绍

要是要合并的两表格,其中一个存在空值的情况,就可以使用​​combine_first()​​方法,

df1 = pd.DataFrame({'A': [None, 0], 'B': [None, 4]})df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})df1.combine_first(df2)

output

A B0 1.0 3.01 0.0 4.0

表格当中的空值就会被另外一张表格的非空值给替换掉

​​combine()​​方法的简单介绍

​​combine()​​方法是将两表格按照列的方向进行合并,但是不同在于还需要另外传进去一个第三方的函数或者是方法,来看一个简单的例子

df1 = pd.DataFrame({'A': [0, 0], 'B': [4, 4]})df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})take_smaller = lambda s1, s2: s1 if s1.sum() < s2.sum() else s2

我们定义了一个简单的方法,在合并的过程中提取出总和较小的值

df1.combine(df2, take_smaller)

output

A B0 0 31 0 3

要是表格中存在空值,​​combine()​​​方法也有​​fill_value​​这个参数来处理

df1 = pd.DataFrame({'A': [0, 0], 'B': [None, 4]})df2 = pd.DataFrame({'A': [2, 2], 'B': [3 3]})df1.combine(df2, take_smaller, fill_value=-5)

output

A B0 0 -5.01 0 4.0

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于slf4j日志MDC输出格式的问题
下一篇:【机器学习】特征选择方法总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~