合并数据表
pandas提供join操作进行数据间的快速合并,默认以行索引对其
def join(self, other, on=None, how="left", lsuffix="", rsuffix="", sort=False)
需要注意的参数有
1. how 数据表合并的方式,默认为left,可选为right,outer与inner。不同参数合并的方式与sql中join的方式一样,分别为以左边为基础,以右边为基础,保留所有,只保留交集。
a=pd.DataFrame(np.ones((2,4)),columns=list("abcd"),index=["A","B"])
b=pd.DataFrame(np.ones((3,3)),columns=list("xyz"),index=["A","B","C"])
print(a)
print(b)
结果:
a b c d
A 1.0 1.0 1.0 1.0
B 1.0 1.0 1.0 1.0
x y z
A 1.0 1.0 1.0
B 1.0 1.0 1.0
C 1.0 1.0 1.0
a.join(b)
结果:
a b c d x y z
A 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B 1.0 1.0 1.0 1.0 1.0 1.0 1.0
b.join(a)
结果:
x y z a b c d
A 1.0 1.0 1.0 1.0 1.0 1.0 1.0
B 1.0 1.0 1.0 1.0 1.0 1.0 1.0
C 1.0 1.0 1.0 NaN NaN NaN NaN
2. on 在实际应用中如果右表的索引值正是左表的某一列的值,这时可以通过将 右表的索引 和 左表的列 对齐合并这样灵活的方式进行合并。
另外,pandas还提供merger进行数据合并,不同于join。merge以列索引对其。并且没有固定的主表
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)
参数 | 含义 |
---|---|
on | 列名,join用来对齐的那一列的名字,用到这个参数的时候一定要保证左表和右表用来对齐的那一列都有相同的列名。 |
left_on | 左表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。 |
right_on | 右表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。 |
left_index/ right_index | 使用左/右侧DataFrame中的行索引做为连接键 |
how | 指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner |
sort | 根据dataframe合并的keys按字典顺序排序,默认是,如果置false可以提高表现。 |
分组与聚合
在SQL语言里有group by功能,在Pandas里有groupby函数与之功能相对应。
一般用法为:
grouped = df.groupby(by="columns_name")
grouped是一个DataFrameGroupBy对象,是可迭代的
grouped中的每一个元素是一个元组,元组里面是(索引(分组的值),分组之后的DataFrame)
很多时候我们只希望对获取分组之后的某一部分数据,或者说我们只希望对某几列数据进行分组,这个时候在后面或者前面加上所需要部分数据的索引或者切片即可。
需要注意的是如果只选择了一列数据,分组后结果不是一个DataFrame对象而是一个Series。
同时需要注意,如果参数by中是一个数组,即选择了一个以上的分组条件,返回的DataFrame或者Series会有一列以上的索引,我们称之为复合索引。
索引与复合索引
简单的索引操作:
获取index:
df.index
指定index :
df.index = ['x','y']
重新设置index :
df.reindex(list("abcedf"))#需要注意的是,这个操作只相当于在原表中取某几行,并不是对于index的更新。
指定某一列作为index :
df.set_index("Country",drop=False)#drop为是否还在原表中保留选作为索引的列,False为保留
返回index的唯一值:
df.set_index("Country").index.unique()
对于复合索引怎样的取值,Series中直接在括号中写索引即可,DataFrame则用到之前说到的loc函数。而如果需要交换索引的值,则使用df.swaplevel()函数