pandas表合并
Pandas实现DataFrame的MergePandas的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','_
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’]), :]
更多推荐
所有评论(0)