连接数据
加载多份数据连接
# 读取数据
df1 = pd.read_csv('../data/concat_1.csv')
df2 = pd.read_csv('../data/concat_2.csv')
df3 = pd.read_csv('../data/concat_3.csv')
print(df1)
print(df2)
print(df3)
# 连接数据 concat([数据1,数据2])方法
row_concat = pd.concat([df1,df2,df3])
DataFrame和Series连接:
Series是列数据,concat方法默认是添加行,由于Series数据没有行索引,所以添加了一个新列,缺失的数据用NaN填充
new_series = pd.Series(['n1','n2','n3','n4'])
row_concat = pd.concat([df1,new_series])
print(row_concat)
concat()方法可以连接多个,如果只需要追加一个对象可以使用append()方法:
df1.append(df2)
DataFrame添加一行数据:
ignore_index = True参数,忽略后面DataFrame的索引
data_dict = {'A':'n1','B':'n2','C':'n3','D':'n4'}
df1.append(data_dict,ignore_index=True)
DataFrame拼接一列数据
添加一列数据只需要DataFrame['列名'] = ['值1','值2']或者DataFrame['列名'] = Series对象
# concat()方法控制参数axis添加列
col_concat = pd.concat([df1,df2,df3],axis=1)
print(col_concat)
重置列索引:
col_concat = pd.concat([df1,df2,df3],axis='columns',ignore_index=True)
print(col_concat)
- 连接不同索引的数据集
用concat直接连接不同索引位置的值为NaN
df1.columns = ['A','B','C','D']
df2.columns = ['E','F','G','H']
df3.columns = ['A','C','F','H']
row_concat = pd.concat([df1,df2,df3])
print(row_concat)
添加join参数为inner,默认为outer,连接时只有索引相同的会显示:
合并多个数据集
读取MySQL数据库表:
from sqlalchemy import create_engine
# sqlalchemy创建mysql数据库连接
engine = create_engine('mysql+pymysql://root:mysql@localhost:3306/teachingdb_rcq')
# read_sql_table('表名',数据库连接引擎) 方法读取数据库
t_course = pd.read_sql_table('t_course',engine)
t_sinfo = pd.read_sql_table('t_sinfo',engine)
t_student = pd.read_sql_table('t_student',engine)
t_student_course = pd.read_sql_table('t_student_course',engine)
t_teacher = pd.read_sql_table('t_teacher',engine)
读取sqlite文件:
from sqlalchemy import create_engine
import os
os.chdir('../')
engine = create_engine('sqlite:///data/chinook.db')
#连接数据库
tracks = pd.read_sql_table('tracks', engine)
tracks.head()
一对一合并:
tracks_subset数据表:
genres数据表:
merge()方法合并:
参数1为merge合并的数据表
on参数: 以xx字段来进行合并,通常为关联主键
how参数:
- left只保留左侧表中的所有key
- right只保留右侧表中的所有key
- inner只保留两个表中共有的key
- outer保留左右两侧表中所有的key`
# 选出GenreId不相同的数据,确定一对一关系
tracks_subset = tracks.loc[[0,62,76,98,110,193,204,281,322,359],]
genres.merge(tracks_subset[['TrackId','GenreId','Milliseconds']],on='GenreId',how='left')
多对一合并
这次合并的是没有进行裁剪的tracks表,多对一关系
genres.merge(tracks[['TrackId','GenreId','Milliseconds']],on='GenreId',how='left')
多对一关系合并,多的那一张表会出现重复值
join合并
数据表:
左侧表.join()方法合并,参数1为连接的右侧表,lsuffix为左侧表指定的别名,rsuffix为右侧,how参数决定保留哪些key详细看上面merge()方法
# 读取数据
stocks_2016 = pd.read_csv('data/stocks_2016.csv')
stocks_2017 = pd.read_csv('data/stocks_2017.csv')
stocks_2018 = pd.read_csv('data/stocks_2018.csv')
# 合并
stocks_2016.join(stocks_2017, lsuffix='_2016', rsuffix='_2017', how='outer')
concat、join和merge的区别
方法 | 特点 |
---|---|
concat | 1. pandas函数 2. 可以垂直和水平的连接两个或多个pandas对象 3. 只用索引对齐 4. 默认是外连接( 也可以内连接 ) |
join | 1. DataFrame方法 2. 只能水平连接两个或多个pandas对象 3. 对齐是依据被调用的DataFrame的列索引或行索引和另一个对象的行索引( 不能为列索引 )4. 默认左连接( 可以调整how参数为右、内、外连接 ) |
merge | 1. DataFrame方法 2. 只能水平连接两个DataFrame对象 3. 同join的 ③ 4. 同join的 ④ |