方法名 | 说明 |
---|---|
concat() | axis设置用于df间行拼接(增加行)或列拼接(增加列)进行内联或外联拼接操作 |
append() | dataframe数据类型的方法,提供了行方向(堆叠行)的拼接操作 |
join() | dataframe数据类型的方法,提供了列方向(拼接列)的拼接操作,支持左联、右联、内联和外联四种操作类型 |
merge() | 提供了类似于SQL数据库连接操作的功能,支持左联、右联、内联和外联等全部四种SQL连接操作类型 |
一、pd.concat()
concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False,copy=True)
-
常用参数说明:
-
axis
:拼接轴方向,默认为0,沿行拼接;若为1,沿列拼接
join
:默认外联’outer’,拼接另一轴所有的label,缺失值用NaN填充;内联’inner’,只拼接另一轴相同的label;
join_axes
: 指定需要拼接的轴的labels,可在join既不内联又不外联的时候使用
ignore_index
:对index进行重新排序
keys
:多重索引
import pandas as pd
df_aa = pd.DataFrame({'zh':['zhang','li','wang','zhao'],
'hero':['达摩','典韦','曹操','李白'],
'score':['85','73','66','81']})
df_zz = pd.DataFrame({'en':['wang','zhao','Trump','Obama'],
'hero':['曹操','墨子','曹操','李白'],
'level':['青铜','白银','黄金','钻石']})
df_concat = pd.concat([df_aa,df_zz]) # 默认沿axis=0,join=‘out’的方式进行concat
df_igno_idx = pd.concat([df_aa,df_zz], ignore_index=True)
'''
# 重新设定index(效果类似于pd.concat([df1,df2]).reset_index(drop=True))
'''
df_col = pd.concat([df_aa,df_zz], axis=1)
pandas 合并多个csv文件
import os
import pandas as pd
files = os.listdir(path) # 获取文件夹下所有文件名
df1 = pd.read_csv(path + '/' + files[0],encoding='gbk') # 读取首个csv文件,保存到df1中
for file in files[1:]:
df2 = pd.read_csv(path +'/'+file,encoding='gbk') # 打开csv文件,注意编码问题,保存到df2中
df1 = pd.concat([df1,df2],axis=0,ignore_index=True) # 将df2数据与df1合并
df1 = df1.drop_duplicates() # 去重
df1 = df1.reset_index(drop=True) # 重新生成index
df1.to_csv(path + '/' + 'total.csv') # 将结果保存为新的csv文件
二、df.append()
append(self, other, ignore_index=False, verify_integrity=False)
-
常用参数说明:
-
other
:另一个df
ignore_index
:若为True,则对index进行重排
verify_integrity
:对index的唯一性进行验证,若有重复,报错。若已经设置了ignore_index,则该参数无效
三、df.join()
join(other, on=None, how=‘left’, lsuffix=’’, rsuffix=’’, sort=False) 主要用于索引上的合并
-
常用参数说明:
-
on
:参照的左边df列名key(可能需要先进行set_index操作),若未指明,按照index进行join
how
:{‘left’, ‘right’, ‘outer’, ‘inner’}, 默认‘left’,即按照左边df的index(若声明了on,则按照对应的列);若为‘right’abs照左边的df。若‘inner’为内联方式;若为 ‘outer’为全连联方式 。
sort
:是否按照join的key对应的值大小进行排序,默认False
rsuffix
:当left和right两个df的列名出现冲突时候,通过设定后缀的方式避免错误
import pandas as pd
df_AA = pd.DataFrame({'zh':['zhang','li','wang','zhao'],
'hero':['达摩','典韦','曹操','李白'],
'movie':['谍影特工','铁血精英','钢铁侠','大鱼海棠']})
df_ZZ = pd.DataFrame({'en':['wang','zhao','Trump','Obama'],
'hero':['赵云','墨子','曹操','李白'],
'movie':['钢铁侠','大鱼海棠','非洲和尚','狮子王']})
df_AA.join(df_ZZ) # 两者有相同的列名‘hero’,'movie',所以报错
df_suffix = df_AA.join(df_ZZ , lsuffix='_A', rsuffix='_Z') # 通过添加后缀避免冲突
'''可以通过将两边的key进行set_index'''
df_set_index = df_AA.set_index('zh').join(df_ZZ.set_index('en'),how='outer',
lsuffix='_A',rsuffix='_Z')
'''或设置后边df中key,通过on与指定的左边df中的列进行合并,返回的index不变'''
df_set_index_on = df_AA.join(df_ZZ.set_index('en'), on='zh', how='outer',
lsuffix='_A',rsuffix='_Z')
效果如下图:
四、pd.merge()
pandas.merge是pandas的全功能、高性能的的内存连接操作,在习惯上非常类似于SQL之类的关系数据库。
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)
-
常用参数说明:
-
left
和right
:两个要合并的DataFrame;
how
:连接方式,有inner、left、right、outer
, 默认为inner;
on
:指的是用于连接的 列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
left_on
:左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用;
right_on
:右侧DataFrame中用于连接键的列名; -
left_index
:使用左侧DataFrame中的 行索引作为连接键;
right_index
:使用右侧DataFrame中的行索引作为连接键; -
sort
:默认为True,将合并的数据进行排序,设置为False可以提高性能;
suffixes
:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’, ‘_y’);
copy
:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能;
indicator
:显示合并数据中数据的来源情况
示例1:默认连接键
import pandas as pd
df_zh = pd.DataFrame({'zh':['zhang','li','wang','zhao'], 'value':['达摩','典韦','曹操','李白']})
df_en = pd.DataFrame({'en':['wang','zhao','Trump','Obama'],'value':['赵云','墨子','曹操','李白']})
df_default = pd.merge(df_zh,df_en) # 使用默认参数
df_outer = pd.merge(df_zh,df_en,how='outer') # 外联模式下
'''
从下图看出:显然以两个DataFrame列名交集(也就是value字段)作为连接键,且默认为内联(取交集)
'''
示例1:指定连接键on – 与连接方式how
df_left_right= pd.merge(df_zh,df_en, left_on='zh',right_on='en') # 默认内联
df_how_left = pd.merge(df_zh,df_en, left_on='zh',right_on='en', how='left') # 以左边的df_zh为标准连接
df_how_right = pd.merge(df_zh,df_en, left_on='zh',right_on='en', how='right') # 以右边的df_en为标准连接
df_how_outer = pd.merge(df_zh,df_en, left_on='zh',right_on='en', how='outer') # 全连接
'''
连接效果如下图:
df_left_right:对zh,en两列交集为标准,关联两个表并匹配相应的value
df_how_left : 以zh 列为标准,关联两个表并匹配相应的value
df_how_right: 以en 列为标准,关联两个表并匹配相应的value
df_how_outer: 以zh,en两列并集为标准(两表的相应列缺失部分补NaN),关联两个表并匹配相应的value
'''
示例5:类似Excel的vlookup函数
import pandas as pd
df1 = pd.read_excel('./shili.xlsx',sheet_name = 'Sheet2')
df2 = pd.read_excel('./shili.xlsx',sheet_name = 'Sheet3')
result = pd.merge(df1,df2.loc[:,['学号','分数']],how='left',on = '学号')
print('df1,df2',df1,df2) # 效果如下图
print('result',result) # 效果如下图
五、列拼接及其他
以下涉及:字符串列的合并,新建并填充列(整列类型转换),数值列的合并
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
raw_data = ['达摩','典韦','曹操','钟无艳','墨子']
data_Dateframe = pd.DataFrame({"name":raw_data})
data_Dateframe['age'] = 17 # 添加age列并填充int 17
data_Dateframe['unit'] = '岁' # 添加unit列并填充str 岁
data_Dateframe['age'] = data_Dateframe['age'].astype('str') # int2str
data_Dateframe['name_sex_age'] = data_Dateframe['name'].str.cat([data_Dateframe.age,data_Dateframe.unit],sep='_')
print(data_Dateframe)
Dataframe_tuple_list_dict: 将Dataframe转成元组、列表及字典
import collections
Dateframe2list = [list(x) for x in data_Dateframe.values]
Dateframe2tuple = [tuple(x) for x in data_Dateframe.values]
Dateframe2dict = collections.OrderedDict(zip(data_Dateframe.name,data_Dateframe.name_sex_age))
Dateframe2dict['达摩']
以上输出依次如下:
'''
Dateframe2list:
[['达摩', '17', '岁', '达摩_17_岁'],
['典韦', '17', '岁', '典韦_17_岁'],
['曹操', '17', '岁', '曹操_17_岁'],
['钟无艳', '17', '岁', '钟无艳_17_岁'],
['墨子', '17', '岁', '墨子_17_岁']]
Dateframe2tuple:
[('达摩', '17', '岁', '达摩_17_岁'),
('典韦', '17', '岁', '典韦_17_岁'),
('曹操', '17', '岁', '曹操_17_岁'),
('钟无艳', '17', '岁', '钟无艳_17_岁'),
('墨子', '17', '岁', '墨子_17_岁')]
Dateframe2dict
OrderedDict([('达摩', '达摩_17_岁'),
('典韦', '典韦_17_岁'),
('曹操', '曹操_17_岁'),
('钟无艳', '钟无艳_17_岁'),
('墨子', '墨子_17_岁')])
'达摩_17_岁'
'''
鸣谢:
https://www.cnblogs.com/wodexk/p/10803979.html