江西省兴赣建设监理咨询有限公司网站,免费制作自己的网站,wordpress无法建立目录,怀集县住房和城乡规划建设网站前言
最近做了一个数据挖掘的项目#xff0c;里面涉及到大量dataframe拼接的操作。在这个过程中#xff0c;我主要使用过两种拼接方法#xff1a;pd.merge和pd.concat。其中遇到过一些坑#xff0c;在这里记录一下。
简介
首先给出pandas官方文档对于这两种方法的介绍里面涉及到大量dataframe拼接的操作。在这个过程中我主要使用过两种拼接方法pd.merge和pd.concat。其中遇到过一些坑在这里记录一下。
简介
首先给出pandas官方文档对于这两种方法的介绍
pd.merge Merge DataFrame or named Series objects with a database-style join. A named Series object is treated as a DataFrame with a single named column. The join is done on columns or indexes. If joining columns on columns, the DataFrame indexes will be ignored. Otherwise if joining indexes on indexes or indexes on a column or columns, the index will be passed on. When performing a cross merge, no column specifications to merge on are allowed. pd.concat Concatenate pandas objects along a particular axis. Allows optional set logic along the other axes. Can also add a layer of hierarchical indexing on the concatenation axis, which may be useful if the labels are the same (or overlapping) on the passed axis number. 可以看出
pd.merge是一个类似于database join的方法和SQL用起来基本没啥区别也是有内连接、外连接之类的这些概念而pd.concat可以指定轴也就是说既可以横向拼接又可以纵向拼接。
基本用法
pd.merge
将两个表按照name字段做pd.merge操作。
import pandas as pddf1 pd.DataFrame([[a, 1],[b, 2],[c, 3],],columns[name, score1],
)
df2 pd.DataFrame([[a, 1],[b, 2],[d, 4],],columns[name, score2],
)result_list {inner: pd.merge(leftdf1, rightdf2, howinner, onname), # 取name的交集outer: pd.merge(leftdf1, rightdf2, howouter, onname), # 取name的并集left: pd.merge(leftdf1, rightdf2, howleft, onname), # 取左边表的nameright: pd.merge(leftdf1, rightdf2, howright, onname), # 取右边表的name
}for merge_type, df in result_list.items():print(merge_type)print(df)输出结果
innername score1 score2
0 a 1 1
1 b 2 2
outername score1 score2
0 a 1.0 1.0
1 b 2.0 2.0
2 c 3.0 NaN
3 d NaN 4.0
leftname score1 score2
0 a 1 1.0
1 b 2 2.0
2 c 3 NaN
rightname score1 score2
0 a 1.0 1
1 b 2.0 2
2 d NaN 4其中缺失值会置为NaN。
pd.concat
import pandas as pddf1 pd.DataFrame([[a, 1],[b, 2],[c, 3],],columns[name, score1],
)
df2 pd.DataFrame([[a, 1],[b, 2],[d, 4],],columns[name, score2],
)result_list {axis0: pd.concat([df1, df2], axis0),axis1: pd.concat([df1, df2], axis1),
}for merge_type, df in result_list.items():print(merge_type)print(df)输出结果
axis0name score1 score2
0 a 1.0 NaN
1 b 2.0 NaN
2 c 3.0 NaN
0 a NaN 1.0
1 b NaN 2.0
2 d NaN 4.0
axis1name score1 name score2
0 a 1 a 1
1 b 2 b 2
2 c 3 d 4同样的缺失值会用NaN填充。
遇到的坑
index或者column被修改
如果合并的两个dataframe中除了name还有名字相同的列那么
pd.merge会默认将column重新命名加上后缀而pd.concat只是简单的做拼接不会对index或者column重新命名进而会导致合并后有重复的index或者column
例子如下
import pandas as pddf1 pd.DataFrame([[a, 1],[b, 2],[c, 3],],columns[name, score],
)
df2 pd.DataFrame([[a, 1],[b, 2],[d, 4],],columns[name, score],
)result_list {inner: pd.merge(leftdf1, rightdf2, howinner, onname),axis0: pd.concat([df1, df2], axis0),axis1: pd.concat([df1, df2], axis1),
}for merge_type, df in result_list.items():print(merge_type)print(df)输出结果
innername score_x score_y
0 a 1 1
1 b 2 2
axis0name score
0 a 1
1 b 2
2 c 3
0 a 1
1 b 2
2 d 4
axis1name score name score
0 a 1 a 1
1 b 2 b 2
2 c 3 d 4index是否相同对于合并的影响
如果合并的两个dataframe的index不相同那么
对pd.merge是没有影响的因为pd.merge本身是基于column进行合并的并且通过on参数去指定根据哪个column进行合并。并且合并之后的index默认是从0开始以1为公差的等差数列而对于pd.concat来说在横向拼接pd.concat(axis1)的时候index会变成两个dataframe的index的并集同时出现的缺失值会用NaN填充
例子如下
import pandas as pddf1 pd.DataFrame([[a, 1],[b, 2],[c, 3],],columns[name, score],index[0, 1, xxx],
)
df2 pd.DataFrame([[a, 1],[b, 2],[d, 4],],columns[name, score],index[0, 1, yyy],
)result_list {inner: pd.merge(leftdf1, rightdf2, howinner, onname),axis0: pd.concat([df1, df2], axis0),axis1: pd.concat([df1, df2], axis1),
}for merge_type, df in result_list.items():print(merge_type)print(df)输出结果
innername score_x score_y
0 a 1 1
1 b 2 2
axis0name score
0 a 1
1 b 2
xxx c 3
0 a 1
1 b 2
yyy d 4
axis1name score name score
0 a 1.0 a 1.0
1 b 2.0 b 2.0
xxx c 3.0 NaN NaN
yyy NaN NaN d 4.0总结
pd.mergepd.concat作用的对象两个dataframe多个dataframe拼接的方式通过指定列名按照类似数据库join的方式进行拼接简单的横向拼接、纵向拼接index是否相同对于合并是否有影响无有拼接结果的区别1. index会默认从0开始编号 2. column可能会被加上后缀当两个dataframe有相同列名时1. index和column的名字不会被修改 2. 可能会出现重复index或重复column两个dataframe中有同名的index或者column 3. 横向拼接的时候行数可能会变两个dataframe中有同名的index