5个Pandas组合函数的异同
5个Pandas组合函数的异同
1. 说明
在日常处理数据的时候,经常会遇到不同dataframe的连接、组合等操作,刚开始用的时候,会有点蒙,毕竟下面几个函数的作用类似,容易产生混淆。
concat下面用最简单的示例进行解释、区分几个函数的作用。
join
merge
combine
append
>>> import pandas as pd>>> df0 = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
>>> df0
ab
014
125
236>>> df1 = pd.DataFrame({"c": [2, 3, 4], "d": [5, 6, 7]})
>>> df1
cd
025
136
247
2. concat concat,全拼 “concatenation”,
允许水平或垂直地并排
组合数据。2.1 行拼接
当合并具有相同列的数据时(2个df列名保持一致,行拼接),可以通过指定轴为 0(默认值) 来调用。
当
axis=0
应理解为,在列的方向进行拼接(向下进行拼接),也就是按行拼接起来。列名需保持一致,得到的才是想要的行拼接,
df1.rename(columns={"c": "a", "d": "b"})
。>>> pd.concat([df0, df1.rename(columns={"c": "a", "d": "b"})]
, axis=0)
ab
014
125
236
025
136
247
如果列名不一致,则得不到想要的行拼接结果。
In [9]: pd.concat([df0,df1],axis=0)
Out[9]:
abcd
01.04.0NaNNaN
12.05.0NaNNaN
23.06.0NaNNaN
0NaNNaN2.05.0
1NaNNaN3.06.0
2NaNNaN4.07.0
小结:
行拼接,如果不产生多余的列,注意列名保持一致2.2 列拼接
按列拼接,
axis=1
可以理解为,在行的方向进行拼接(向右进行拼接),也就是将列拼接起来。>>> pd.concat([df0, df1], axis=1)
abcd
01425
12536
23647
在默认情况下,当水平组合数据(即沿列)时,会尝试使用索引。当它们不相同时,会看到 NaN 填充不重叠的数据,如下所示:
>>> df2 = df1.copy()
>>> df2.index = [1, 2, 3]
>>> pd.concat([df0, df2], axis=1)
abcd
01.04.0NaNNaN
12.05.02.05.0
23.06.03.06.0
3NaNNaN4.07.0
如果想统一索引进行拼接,就必须先重置它们的索引:
>>> pd.concat([df0.reset_index(drop=True),
df2.reset_index(drop=True)], axis=1)
abcd
01425
12536
23647
小结:
列拼接,如果不产生多余的行,注意索引保持一致3. join 与 concat 相比,join 专门用于
使用索引连接DataFrame对象之间的列
。【5个Pandas组合函数的异同】df0,df1的索引一致:
>>> df0.join(df1)
abcd
01425
12536
23647
当索引不一致,连接默认保留来自左侧 DataFrame 的行(默认左表是驱动表);如果右侧DataFrame中没有左侧DataFrame中匹配索引的行,右侧DataFrame被删除、用Null填充,如下所示:
>>> df0.join(df2)
abcd
014NaNNaN
1252.05.0
2363.06.0
还可以通过设置 how 参数来更改驱动表,也就是SQL中的几种关联连接。
# "right" uses df2’s index
>>> df0.join(df2, how="right")
abcd
12.05.025
23.06.036
3NaNNaN47# "outer" uses the union
>>> df0.join(df2, how="outer")
abcd
01.04.0NaNNaN
12.05.02.05.0
23.06.03.06.0
3NaNNaN4.07.0# "inner" uses the intersection
>>> df0.join(df2, how="inner")
abcd
12525
23636
小结:
join是基于索引的连接,只有列连接,与sql的关联类似4. merge 与join相比,merge更为通用,可以对列和索引执行合并操作。
在a列上进行内关联:
>>> df0.merge(df1.rename(columns={"c": "a"}),
on="a", how="inner")
abd
0255
1366
如果想同时保留关联列,则可以这样写:
>>> df0.merge(df1, left_on="a", right_on="c")
abcd
02525
13636
当两个 DataFrame 对象具有相同的列,而不是要合并时,
suffixes
参数设置这些列重命名的后缀;默认情况下,左、右数据框的后缀分别是“_x”和“_y”,也可以自定义。>>> df0.merge(df1.rename(columns={"c": "a", "d": "b"}),
on="a",
how="outer",
suffixes=("_l", "_r"))ab_lb_r
014.0NaN
125.05.0
236.06.0
34NaN7.0
5. combine combine函数也是作用于2个DataFrame对象之间,按列组合,但它与上面几个函数有很大不同。
combine函数的特殊之处在于它需要一个
函数参数
。此函数采用两个series,每个series对应于每个 DataFrame 中的合并列,并返回一个series作为相同列的元素操作的最终值。有点绕,看个示例:
>>> def taking_larger_square(s1, s2):
...return s1 * s1 if s1.sum() > s2.sum() else s2 * s2>>> df0.combine(df1.rename(columns={"c": "a", "d": "b"}),
taking_larger_square)
ab
0425
1936
21649
take_larger_square 函数对 df0 和 df1 中的 a 列以及 df0 和 df1 中的 b 列进行操作。 在两列 a 和两列 b 之间,taking_larger_square 取较大列中值的平方。 在这种情况下,df1 的 a 和 b 列将作为平方,产生最终值,这里恰好是df1的a、b都大于df0的a、b,如果df1中的一个大、一个小,则还是取最大的那个作为平方。
In [13]: df0,df1
Out[13]:
(ab
012
123
234,
cd
041
152
263) In [11]: df0.combine(df1.rename(columns={"c": "a", "d": "b"}),
taking_larger_square)
Out[11]:
ab
0164
1259
23616
小结:
用combine进行组合,主要是针对2个DataFrame对象中的series进行函数处理,取其一作为结果。6. append append 函数专门用于
将行追加到现有 DataFrame 对象
,创建一个新对象。>>> df0.append(df1.rename(columns={"c": "a", "d": "b"}))ab
014
125
236
025
136
247
这和concat( ,axis=0)效果一样。
append 的独特之处在于还可以追加 dict 对象,这为我们提供了追加不同类型数据的灵活性。注意,必须将 ignore_index 设置为 True,因为dict对象没有 DataFrame 可以使用的索引信息。
>>> df0.append({"a": 1, "b": 2}, ignore_index=True)ab
014
125
236
312
7. 总结
- concat:按行和按列组合数据
- join:使用索引,按行合并数据
- merge:按列合并数据,更像数据库连接操作
- combine:按列合并数据,具有列间(相同列)元素操作
- append:以DataFrame或dict对象的形式逐行追加数据
Distinct数说
文章图片
推荐阅读
- 21天|21天|羊多多组合《书都不会读,你还想成功》
- 15个从现实焦虑中恢复精神的方法!
- 工具分享|5个有趣好玩的网站,拒绝无聊!
- 2018-08-29|2018-08-29 - 草稿 - 草稿
- R语言|R语言 函数
- 急需解答一个组合题
- 21天|21天 书香美妈组合?魔鬼老大,天使老二?
- 微信视频号iOS端大改版!5个月等待,20+项功能改动了解一下()
- 175.|175. 组合两个表(SQL)
- 15个关于读书的名人名言,作文用得上!