开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:pandas 数据合并与整形 3】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15394
pandas 数据合并与整形 3
下面来学习交流合并数据集,这个数据集的合并,pandas 里有几种方式来合并数据。
1. Pandas.merge 按一个或多个 key 来将 DataFrame 中的行连接起来。这个和 SQL 或其他一些关系型数据库中的 join 操作很相似。
2. Pandas.concat 在一个 axis(轴)上,串联或堆叠(stack)多个对象。
3. Combine_first实例方法(instance method)能合并相互之间有重复的数据,并用一个对象里的值填满缺失值。
这就是提到的三种方式,主要使用的是 merge 和 concat。
Database-Style DataFrame Joins
那么先来学习具有数据库风格的 DataFrame joins 函数的合并方法,merge 和 join操作,都能够通过一个或多个 key(关键字段),可以把不同数据集的行连接在一起。这种操作主要集中于关系型数据库,和关系型数据库操作很类似,Pandas 中的 merge 函数具有这种功能,是操作的主要切入点。
下来可以查看加载数据包,然后这里做出数据框:df1=pd.DataFrame({‘key’:【‘b’,‘b’,‘a’,‘c’,‘a’,‘a’,‘b’】,‘data1’:range(7)})这里运行查看结果
结果有两列,分别为 key 和 data1,然后这左边是它的索引。
然后再看 df2=pd.DataFrame({‘key’:【‘a’,‘b’,‘d’】,然后这里也有 key 和 data2。然后,因为这两个数据框都有相同的 key 这一列,可以认为是列的索引。
下面的例子里是 many-to-one join(多个变为一个的连接),那为什么是多对一的连接呢?看后面的操作结果可以得知,在 df1中有标签 a 和 b 的行,而 df2中的 key 列,每一行只有对应的一个值,在 key 中是不重复的。那么调用 merge 函数来合并可以得到:
Pd.merge(df1,df2),其就按照 key 将其合并在一起,然后需要对应的去对应,如果 a 相同,就往数据里面合并,然后在第 df1里的 c 就忽略掉了,再来看合并后的结果。注意观察合并后的结果,只在相同的字段上面进行合并,等于扩展到一个新的列,把 df2里面的这个 data2进行列加上去,加的过程要注意按照关键字项。
那么这里并没有指定哪一列,如果没有指定的话,merge 会用两个对象中都存在的列名作为 key。因为刚刚两个都有 key,所以没有指定的情况下,其还是由共同的字段作为指定的列,然后进行合并,当然最好还是清楚的指定比较好。举个例子,这里合并 df1和 df2,也就是 pd.merge(df1,df2,on=;‘key’) key 项这一列上进行合并,运行然后查看结果。
那么如果每个对象中的列名不一会,可以分别指定。
可以查看下方代码:
df3=pd.DataFrame({‘lkey’:【‘b’,‘b’,‘a’,‘c’,‘a’,‘a’,‘b’】,‘data1’:range(7)})
是这样的数据框,其 key 变为 lkey。
Df4=pd.DataFrame({‘rkey’:【‘a’,‘b’,‘d’】,‘data1’:range(3)})
然后 df4的数据框,是将 key 变为rkey。
含义一个是左一个是右,所以来看数据,如果需要显示,可以增加一个单元格去显示。然后看看代码:pd.merge(df3,df4,Left_on=‘lkey’,right_on=‘rkey’),所以 lkey 和 rkey,在这里面会被用上,是按照这样的 key 去合并。因为 df3和 df4之间的两个数据、表中,其列的名字不一样,那么df3左边的表里,以 lkey 对齐,然后 df4右边的表里面有 right,也就是 rkey 作为对齐,所以以这两个关键字作为对齐,把这两张表的两个数据框进行合并。
这个需要进行理解,同时这份合并后的数据里并没有 c 和 d,因为merge 合并的方式等于是数据库里面的 inner join 内连接,结果中的 key 只是交集的结果,或者在两个表格中都有的集合。如果需要做其并集的情况下。其 how=‘outer’,所以 outer 叫外连接,它是取 key 的合集。这里来运行查看效果,然后显示其就有了 c 和 d,那也可以用它的 df1和 df2这两份数据,它里面控制对应这段是 key。
另外还可以补充 how 的一些选项,那么下来可以看一下例子,这是数据 df1=pd.DataFrame({‘key’:【‘b’,‘b’,‘a’,‘c’,‘a’,‘b’】}),‘data1’:range(6)})
然后是数据 df2=pd.DataFrame({‘key’:【‘a’,‘b’,‘a’,‘b’,‘d’】}),‘data2’:range(5)})
它们都有共同的列(key),然后下面来使用 how 选项,这里是 df1和 df2进行合并。用参数 on = key在 key 上合并,那 how = left。how 合并的方式还有inner outer left right等。这里举个例子,合并是how=left,表示是把 df1和 df2,df1是左边的数据框,将左边的数据框固定,固定情况看上面的数据,df1也就是这六个值(0,1,2,3,4,5)固定起来,然后 df2和 df1,然后做 data 空间的计算,这个可能大家需要去看例子思考原因?比如在 df1里 b 有三个,然后在 df2里面的 b 有两个,当它们合并时,按照 data 的计算最终是3*2=6个,所以看看合并后的结果也是 b 有6个,所以注意,df1是以它作为基准,所有的数据线保持不变。然后 df2按照 key 值与 df1做 data 空间的计算,最终得到的主题结果。
还有 inner 、outer、left、right等。下面有解释,就是 many-to-many join的连接合并是对行进行笛卡尔集运算。(两个集合 x 和 y 的笛卡尔积),也称为直积,在集合论中表示为 x*y,是所有里面可能的有序对组成的集合。这种例子也很简单,很直接。
如果是 how = inner 就是内部的交易,然后上面像 C 和 D 也保留了,所以要注意这个差别。
那么用多个 key 来连接的话,用一个含有多个列名的 list来制定:像这里做了两个数据框:
Left=pd.dataframe({‘key1’:【‘foo’,‘foo’,‘bar’】,
‘key2’:【‘one’,‘two’,‘one’】,
‘lval’:【1,2,3】})
Right=pd.dataframe({‘key1’:【‘foo’,‘foo’,‘bar’,‘bar’】,
‘key2’:【‘one’,‘one’,‘one’,‘two’,】,
‘rval’:【4,5,6,7】})
那么运行看这两份数据,这里需要合并 left 数据框和 right 数据框,on=【‘key1’,‘key2’】,how=‘outer’。这个操作是可以进行的。
那么选择哪一种 key 组合会出现在结果取决于 merge 方法的选择。那么可以把多个 key 当做一个 tuple 组成的单一 key,然后让数据去使用,那么还有一个问题,就是在做 merge 操作时,如何处理重叠的列名?当想手动解决重叠列名问题时,可以加后缀,这里注意下面的例子:
Pd.merge(left,right,on=‘key1’),left 和 right里面都有key1,那么按照它们合并时,去看一下这里有了 key2_X,key2_Y 这样的结果,其命名也是可以自己添加的,也可以指定。下面就有指定的添加的后缀:suffixes=(‘_left’,‘_right’),所以运行结果如下。
上面显示也是用 X 和 Y,等于相当于两个坐标轴之间操作,但也要注意其之间的差距。