Pandas实现DataFrame的Merge

Pandas的merge,相当于Sql的join,将不同的表按key关联到一个表

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:要merge的dataframe或者有name的Series
  • how:join类型,‘left’, ‘right’, ‘outer’, ‘inner’
  • on:join的key,left和right都需要有这个key
  • left_on:left的df或者series的key
  • right_on:right的df或者seires的key
  • left_index,right_index:使用index而不是普通的column做join
  • suffixes:两个元素的后缀,如果列有重名,自动添加后缀,默认是(‘_x’, ‘_y’)

merge时数量的对齐关系

  • one-to-one:一对一关系,关联的key都是唯一的
    • 比如(学号,姓名) merge (学号,年龄)
    • 结果条数为:1*1
  • one-to-many:一对多关系,左边唯一key,右边不唯一key
    • 比如(学号,姓名) merge (学号,[语文成绩、数学成绩、英语成绩])
    • 结果条数为:1*N
  • many-to-many:多对多关系,左边右边都不是唯一的
    • 比如(学号,[语文成绩、数学成绩、英语成绩]) merge (学号,[篮球、足球、乒乓球])
    • 结果条数为:M*N

理解left join、right join、inner join、outer join的区别

left join(左连接)

左边所有的key都会作为返回表的key,而右边针对这一key没有对应值则填充Null

right join(右连接)

与上面相反,右边的所有key都会出现在返回的表中,如果左边没有相应的则填充Null

inner join(内连接)

默认的连接方式,当key两个表都存在的时候才作为返回表的key

outer join(外连接)

左右两边的key都会出现在返回表中,如果没有对应值,则填充Null

非key字段重复会默认加后缀,也可以通过suffixes手动设置

Pandas实现数据的合并concat

concat语法(按照轴向合并pandas对象)

pandas.concat(objs, axis=0, join='outer', ignore_index=False)
  • objs:一个列表,内容可以是DataFrame或者Series,可以混合
  • axis:默认是0代表按行合并,如果等于1代表按列合并
  • join:合并的时候索引的对齐方式,默认是outer join,也可以是inner join
  • ignore_index:是否忽略掉原来的数据索引

append语法(在下面添加)

pandas.concat(objs, axis=0, join='outer', ignore_index=False)
  • other:单个dataframe、series、dict,或者列表
  • ignore_index:是否忽略掉原来的数据索引
Pandas批量拆分Excel与合并Excel

首先读取数据,然后算出拆分的份数,将大表通过循环取出一个个小表,使用to_excel方法保存
反过来便是合并

Pandas的分组聚合groupby

首先使用groupby先对数据进行分组,然后在对每一个分组使用聚合、转换函数

例:

df.groupby('字段').sum()  #对字段列进行分组,按分组结果进行求和统计,字段列会变成索引列

df.groupby(['字段1','字段2']).mean()  #对多个字段进行分组,先按照字段1分,然后按照字段2分,最后进行平均值操作

#同时查看多种统计结果
df.groupby('字段').agg([np.sum,np.mean,np.std])  #还是按指定字段分组,但会生成多列其他数据

#查看,但只看一列的多种统计结果
df.groupby('字段1')['字段2'].agg([np.sum,np.mean,np.std])

#不同列使用不同聚合函数
df.groupby('字段1').agg({"字段2":np.sum,"字段3":np.mean})  #结果字段2列值为和,字段3列值为平均值

可以利用for循环遍历groupby分组的每一个组

可以利用get_group()获取单个分组 .get_group('字段')

.get_group(('字段1','字段2')) 传入多个字段

Pandas的分层索引MultiIndex

Series

首先需要利用.groupby(多个字段列表) 就会建立一个多维索引的结构,即先按一个字段分,再按另一个字段分

在多维索引中,空白表示上面的值,例如索引列。

#用unstack将二级索引变成列
#例:
ser.unstack()

	日期	2019-10-01	2019-10-02	2019-10-03
	公司			
	BABA	165.15	165.77	169.48
	BIDU	102.00	102.62	104.32
	IQ		15.92	15.72	16.06
	JD		28.19	28.06	28.80

当Series拥有多层索引后使用.loc[‘字段’]可以取出整个,
且可以使用元组的形式筛选。

DataFrame

在选择数据时:

元组(key1,key2)代表筛选多层索引,其中key1是索引第一级,key2是第二级,比如key1=JD, key2=2019-10-02

列表[key1,key2]代表同一层的多个KEY,其中key1和key2是并列的同级索引,比如key1=JD, key2=BIDU

slice(None)代表筛选这一索引的所有内容

stocks.loc[(slice(None), [‘2019-10-02’, ‘2019-10-03’]), :]

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐