本次笔记内容:
[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()的用法。
....等我想到了会加上。