本次笔记内容:

[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()的用法。

....等我想到了会加上。