python学习:pandas学习笔记(四)合并
本次笔记内容:
[i for i in a if i in b]
等pd.concat(join='outer', axis=0...)
pd.merge(df1,df2,how='inner',left_index...left_on='colname')
- 总结和提醒
先说一个pandas之外的东西:
在对list进行操作时,有时需要提取两个list的交集,补集,或者不重复的两者合集等。
diff = [i for i in list1 if i not in list2]
# 找到list1中有,list2中没有的object, 直截了当。同理可得:
diff = [i for i in list1 if i in list2]
diff = [i for i in list2 if i not in list1] # 等等
工作中有时候有两个相近的data frame,我们同样需要提取两者的交集,补集,或者不重复的两者合集等。
根据实际情况,可以先把两个data frame的index转化为两个list, 然后再进行操作。
合并两个data frame时,需要了解merge和concat的区别。
pd.concat(join='outer', axis=0...)
concat
默认为将两个(或多个)dataframe的行合并起来(有重复的行算作新的行,允许重复行名),列则相同的归在同一列。这使得合并后行可能有重复,列不会有。且默认为'outer'的方式,即合并后的dataframe列,是df1和df2列的合集。'inner'则为合并后的dataframe列是df1,df2的交集。
join_axes=
参数指定了合并后dataframe的列。比方说pd.concat([df1,df2], join_axes=[df1.columns])
则按照df1的列来合并,不会出现df2独有的列。
pd.merge(df1,df2,how='inner', left_index...left_on='colname')...
pd.merge()
是更加正式、严谨,功能完善的用法。注意这里不用把要merge的dataframes放进[]
中。pd.merge()
会识别出两个(或多个)dataframe共有的column, 并且以此为key来进行合并。其默认为'inner'
合并。
on='colname'
指定根据哪一列来进行合并,在这个colname同时出现在两个dataframe中才可以
left_on='colname, right_on='colname', left_index=True...
如果key的colnames不同,指定两个要合并的dataframe的key。可以指定Index为key。
how='inner'
指定合并方式为inner, outer, left, right。指定为left则合并后dataframe的colnames和第一个dataframe一致,right则为与第二个dataframe一致。
suffixes=[...]
如果两个要合并的dataframe中存在一个行名对应了2个不同的值,则会根据不同dataframe来源拆分开来。以suffixes设置其后缀。
书和网站等资源会把pd.merge()
总结为"one to one", "many to one", "many to many"三种。其实就是两个待合并的dataframe是否存在重复行,存在重复行如何合并的问题。
"one to one"是两个dataframe可以一一对应,其行数目一致。
"many to one"就是只有一个dataframe存在重复行。pd.merge()
的合并dataframe会以重复行为准进行填充。"many to many"也是一样的。
总结和提醒
综上:
-
pd.concat()
适用于2个或多个dataframe的合并,可以选择inner
和outer
的方式;pd.merge()
只能合并2个dataframe,可以选择inner
,outer
,left
,right
的合并方式。 -
pd.concat()
的默认合并方式为outer
及对行进行叠加式的合并,即合并后行的数目为合并前之和。pd.merge()
的默认合并方式为inner
。两种合并方式得到的合并后dataframe列都是合并前列名的合集。 -
pd.concate(key=[...])
是在你想要合并后的dataframe为multiindex设置的,不要和pd.merge()
中合并需要一个key的概念混了。 -
pd.concat()
默认以index作为key来合并,pd.merge()
可以设置为index,也可以指定其他的column。其默认是找到两个dataframe中相同的列名作为合并的key。 - 即使两个dataframe中没有相同的行或列,
pd.concat()
也可以把他们拼接起来,并且用NaN填充空缺值。pd.merge()
必须要有相同的列。可以使用df1.join(df2)
把df2的列合并到df1上。
另外append也可以当concate的默认用法来使用,比方说df1.append(df2)
但是由于创造了新的dataframe,效率并不高。
df1.join(df2)
的结果为:df1的行及df1,df2列的合集。有点像R里cbind()
的用法。
- ....等我想到了会加上。
参考:
超详细的文档:关于pd.concat(), pd.merge(), df1.join(df2), df1.append(df2), df1.merge(df2)等用法
书:Python Data Science Handbook