数据重构

pandas包的merge、join和concat方法来完成数据的合并和拼接,merge方法主要是基于两个dataframe的共同列进行合并,join方法主要是基于两个dataframe的索引进行合并,concat方法是对series或dataframe进行行拼接或列拼接,本文详细分析了上面三种方法的合并和拼接操作。

1. Merge方法

merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None) -> 'DataFrame'

pandas的merge方法是基于共同列,将两个dataframe连接起来。下面分析merge方法的主要参数含义:

left/right:左/右位置的dataframe。

how:数据合并的方式。left:基于左dataframe列的数据合并;right:基于右dataframe列的数据合并;outer:基于列的数据外合并(取并集);inner:基于列的数据内合并(取交集);默认为'inner'。

on:用来合并的列名,这个参数需要保证两个dataframe有相同的列名。

left_on/right_on:左/右dataframe合并的列名,也可为索引,数组和列表。

left_index/right_index:是否以index作为数据合并的列名,True表示是。

sort:根据dataframe合并的keys排序,默认是。

suffixes:若有相同列且该列没有作为合并的列,可通过suffixes设置该列的后缀名,一般为元组和列表类型。

merges通过设置how参数选择两个dataframe的连接方式,有内连接,外连接,左连接,右连接,下面通过例子介绍连接的含义。

 

 

 

 

 

 

 

2. Join方法

3. concat方法

concat方法是拼接函数,有行拼接和列拼接,默认是行拼接,拼接方法默认是外拼接(并集),拼接的对象是pandas数据类型。

obj:要合并的series,dataframe或者是panel构成的序列,常将这些数据排成一个列表[data1,data2....]。
axis:按照哪个方向拼接,0是纵向拼接(默认),1是横向拼接。
join:设置合并取交集(inner)还是并集(outer)。纵向拼接时取column的交并集,横向拼接时取index的交并集。
join_axes:index的列表,仅在横向合并时使用,指明要将数据合并入哪个原表的index。
ignore_index:如果设置为true,则无视表的index,直接合并,合并后生成新的index。
keys:表标识的列表,用来区分合并的表来自哪里。

a=pd.Series([1,2,3],index=['x1','x2','x3'])
b=pd.Series([2,3,4],index=['x1','x2','x4'])
pd.concat([a,b])

x1    1
x2    2
x3    3
x1    2
x2    3
x4    4
dtype: int64


pd.concat([a,b],axis=1)

	0	1
x1	1.0	2.0
x2	2.0	3.0
x3	3.0	NaN
x4	NaN	4.0



pd.concat([a,b],keys=['fea1','fea2'])

fea1  x1    1
      x2    2
      x3    3
fea2  x1    2
      x2    3
      x4    4
dtype: int64



 加上join参数的属性,如果为’inner’得到的是两表的交集,如果是outer,得到的是两表的并集。

如果有join_axes的参数传入,可以指定根据那个轴来对齐数据 
pd.concat([df1, df4], axis=1, join_axes=[df1.index])

append

append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)

DataFrame.append(*other*, *ignore_index=False*, *verify_integrity=False*, *sort=None*)

  • other: 是要添加的数据,可以是dataframe,dict,Seris,list等等。
  • ignore_index: 参数为True时将在数据合并后,按照0,1,2,3....的顺序重新设置索引,忽略了旧索引。
  • verify_integrity:参数为True时,如果合并的数据与原数据包含索引相同的行,将报错。

Groupby 

import numpy as np
company=['A','B','C','D']
data=pd.DataFrame({
    'company':[company[x] for x in np.random.randint(0,len(company),10)],
    'salary':np.random.randint(5,50,10),
    'age':np.random.randint(15,50,10)
})

data.groupby('company')

 

data.groupby('company').agg({'salary':'median','age':'mean'})

 

avg_salary=data.groupby('company')['salary'].mean().to_dict()
data['avg_salary']=data['company'].map(avg_salary)
data


data['avg_age']=data.groupby('company')['age'].transform('mean')
data

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值