pandas DataFrame表格(列)拼接(concat,append,join,merge)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wsp_1138886114/article/details/101015664

方法名 说明
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)

常用参数说明:
leftright:两个要合并的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

猜你喜欢

转载自blog.csdn.net/wsp_1138886114/article/details/101015664