刚刚使用Python学习进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~
上一篇介绍《Pandas的基础操作:介绍/创建/查看数据/赋值/删除》:https://blog.csdn.net/weixin_42969619/article/details/96863875
本文是继续上一篇的内容,作为第7部分:数据的合并
7. 合并数据
(1)直接连接两个数据使用:pd.concat([df1, df2, df2, …])
- 使用axis=0默认值合并,将数据纵向连接
df1=pd.DataFrame(np.random.randn(3,4),columns=list('ABCD'))
df2=pd.DataFrame(np.random.randn(4,3),columns=list('ACE'))
data=pd.concat([df1,df2])
data
- 使用axis=1合并,将数据横向连接
df1=pd.DataFrame(np.random.randn(3,4),columns=list('ABCD'))
df2=pd.DataFrame(np.random.randn(4,3),columns=list('ACE'))
data=pd.concat([df1,df2],axis=1)
data
需要注意的是:
在axis=0的情况下,两个数据合并是匹配“相同列名”合并,没有匹配到的列则会创建一列新数据;结构上没有值的位置用NaN补齐
在axis=1的情况下,两个数据合并是匹配“相同行名”合并,没有匹配到的行则会创建一行新数据;结构上没有值的位置用NaN补齐
(2)关联表:
应用场景通常是针对同一个主键存在两张包含不同字段的表,现在我们想把他们整合到一张表里
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)
参数说明:
a. on
参数:表示两个对象按哪个指定列(键名)进行合并,默认值为空,即系统会自动匹配两个对象中相同列名,将其作为“连接键”
b. 如果该列在两个对象上的列名不同,则要通过 left_on
, right_on
来一起指定。
c. suffixes=('_x','_y')
参数指的是,当左右对象中存在同名列(除了连接键外),在结果集中的区分方式,即分别各加一个小尾巴。
d. how
参数:指的是当左右两个对象中存在不重合的列时,对数据处理方式,默认值’inner’ 代表取两对象的交集;outer 代表取两对象的并集;left 和 right 分别为取一边
使用下列数据举例:
df1=pd.DataFrame({'id':['a','b','b',"c"],"name":["A","B","B","C"],'sale':np.random.randint(5,size=4)})
df2=pd.DataFrame({"id":['c',"a","d"],"name":["C","B","D"],"brand":["AA","BB","AB"]})
df3=pd.DataFrame({"id_2":["a","b","c","d"],"name":["A","B","C","D"],"price":np.arange(4)})
df1
df2
df3
- 两组数据中有多个相同名称的列(on参数会默认全部匹配作为“连接键”)
# on参数全部匹配和传入参数“id”
pd.merge(df1,df2)
pd.merge(df1,df2,on="id")
两组数组中,虽然都有“name”列,但是对应"id"的元素给出了不同的定义;在df1表中"id=a"时对应的是"name=A",而在df2表中,对应的是"name=B"。所以在默认将全部相同列作为“连接键”时,只有一条数据。
- 参数how的不同取值(默认是只显示重合的数据)
# 默认显示重合的数据,如上例子;对比取值为"left"/"right";而"outer"实际上就是结合了"left"和"right"
pd.merge(df1,df2,on="id",how="left")
pd.merge(df1,df2,on="id",how="right")
- 想使用两组数据中列名各自不同的列作为“连接键”
# 使用df1和df3作为例子,其中包含相同列名"name";如果不传参数,会自动匹配"name"作为“连接键”
pd.merge(df1,df3,left_on="id",right_on="id_2")
pd.merge(df1,df3,left_on="id",right_on="id_2",how="left")
pd.merge(df1,df3,left_on="id",right_on="id_2",how="right")
- 上面很多数据数据中,由于原数据有都有"name"列,又没有将其作为“连接键”;所以展示时,出现:“name_x"和"name_y”。使用参数suffixes 提前重新命名
pd.merge(df1,df2,left_on="id",right_on="id_2",suffixes=['_customer','_order'])
(3)多表联合:df1.merge(df2).merge(df3).merge(df4)
df1.merge(df2).merge(df3)