import numpy as np
import pandas as pd
一、关系型连接
把两个表根据某一个键或者某一组键连接起来,就属于连接。(这里可以与数据库相联系,其实从理论上讲都是相同的操作。)连接的类型包括左连接、右连接和内外连接。外连接又叫全连接。
1.值连接
可以通过几列值的组合进行连接,这种基于值的连接可以由 merge 函数实现
df1 = pd.DataFrame({'Name':['San Zhang','Si Li'],
'Age':[20,30]})
df2 = pd.DataFrame({'Name':['Si Li','Wu Wang'],
'Gender':['F','M']})
df1.merge(df2, on='Name', how='left')
| Name | Age | Gender |
---|
0 | San Zhang | 20 | NaN |
---|
1 | Si Li | 30 | F |
---|
df1 = pd.DataFrame({'df1_name':['San Zhang','Si Li'],
'Age':[20,30]})
df2 = pd.DataFrame({'df2_name':['Si Li','Wu Wang'],
'Gender':['F','M']})
df1.merge(df2, left_on='df1_name', right_on='df2_name', how='left')
| df1_name | Age | df2_name | Gender |
---|
0 | San Zhang | 20 | NaN | NaN |
---|
1 | Si Li | 30 | Si Li | F |
---|
如果两个表中的列出现了重复的列名,那么可以通过 suffixes 参数指定
df1 = pd.DataFrame({'Name':['San Zhang'],'Grade':[70]})
df2 = pd.DataFrame({'Name':['San Zhang'],'Grade':[80]})
df1.merge(df2, on='Name', how='left', suffixes=['_Chinese','_Math'])
| Name | Grade_Chinese | Grade_Math |
---|
0 | San Zhang | 70 | 80 |
---|
2.索引连接
索引连接,就是把索引当作键。与上面的那个值连接相似。
df1 = pd.DataFrame({'Age':[20,30]},
index=pd.Series(
['San Zhang','Si Li'],name='Name'))
df2 = pd.DataFrame({'Gender':['F','M']},
index=pd.Series(
['Si Li','Wu Wang'],name='Name'))
df1.join(df2, how='left')
| Age | Gender |
---|
Name | | |
---|
San Zhang | 20 | NaN |
---|
Si Li | 30 | F |
---|
df1 = pd.DataFrame({'Grade':[70]},
index=pd.Series(['San Zhang'],
name='Name'))
df2 = pd.DataFrame({'Grade':[80]},
index=pd.Series(['San Zhang'],
name='Name'))
df1.join(df2, how='left', lsuffix='_Chinese', rsuffix='_Math')
| Grade_Chinese | Grade_Math |
---|
Name | | |
---|
San Zhang | 70 | 80 |
---|
df1 = pd.DataFrame({'Age':[20,21]},
index=pd.MultiIndex.from_arrays(
[['San Zhang', 'San Zhang'],['one', 'two']],
names=('Name','Class')))
df2 = pd.DataFrame({'Gender':['F', 'M']},
index=pd.MultiIndex.from_arrays(
[['San Zhang', 'San Zhang'],['two', 'one']],
names=('Name','Class')))
df1
| | Age |
---|
Name | Class | |
---|
San Zhang | one | 20 |
---|
two | 21 |
---|
df2
| | Gender |
---|
Name | Class | |
---|
San Zhang | two | F |
---|
one | M |
---|
df1.join(df2)
| | Age | Gender |
---|
Name | Class | | |
---|
San Zhang | one | 20 | M |
---|
two | 21 | F |
---|
二、方向连接
1.concat
这个与关系连接的区别在于这个不需要指定相同的列,就是将俩表连接起来。指定是行还是列(axis=0 or 1)
df1 = pd.DataFrame({'Name':['San Zhang','Si Li'],
'Age':[20,30]})
df2 = pd.DataFrame({'Name':['Wu Wang'], 'Gender':['M']})
pd.concat([df1, df2],axis=1)
| Name | Age | Name | Gender |
---|
0 | San Zhang | 20 | Wu Wang | M |
---|
1 | Si Li | 30 | NaN | NaN |
---|
pd.concat([df1, df2],axis=0,join='inner')
| Name |
---|
0 | San Zhang |
---|
1 | Si Li |
---|
0 | Wu Wang |
---|
keys可以产生多级索引,对原来合并前的表进行一个标识
df1 = pd.DataFrame({'Name':['San Zhang','Si Li'],
'Age':[20,21]})
df2 = pd.DataFrame({'Name':['Wu Wang'],'Age':[21]})
pd.concat([df1, df2], keys=['one', 'two'])
| | Name | Age |
---|
one | 0 | San Zhang | 20 |
---|
1 | Si Li | 21 |
---|
two | 0 | Wu Wang | 21 |
---|
总结
就到这里了。本次学习时间分配的不是很合理。导致学习起来也不在状态,就不自欺欺人了,再往下学也没有收获那就到这里吧,等再学到连接这里补充。