DataFrame中merge、concat、join,以及用一个data更新另一个data的方法

DataFrame中合并的的函数主要是merge、concat、join,但是某些时候,使用这三个并不能达到我们需要的目的,比如现在有两个DataFrame,一个大的,一个小的,其中大的DataFrame中对应小的位置为null,那么如何用小的DataFrame来更新大的dataframe呢?

用exc2_inwindCMF来更新dt,其中dt['fund_code_d']包含了exc2_inwindCMF['fund_code_d'],dt其他位置对应的均为null,这时尝试merge,concat,join,都失效,merge形式会产生suffixes,多出 _x 和 _y,达不到我们的目的。

 正确有效的方法是:

第一步:dt和exc2_inwindCMF采用merge合并,how=‘inner’,然后去掉无用的字段(suffixes_x);

第二步:以fund_code_d为索引,重置索引

第三步:把两个DataFrame转化成dict,用update;这里为什么不能直接用updata呢?因为update在更新时,会根据key,将key对应的value全部替换,所以为了避免字段缺失,用来更新的dict必须和被更新的dict的字段完全一样才能达到目的。

dt_copy=dt.copy()
exc2_inwindCMF_copy = exc2_inwindCMF.copy()

# 使用merge时 如果不是on的关键字,如果左右有相同的columns,则会出现_x,_y,需要做处理 
aa = pd.merge(dt_copy,exc2_inwindCMF_copy,on='fund_code_d',how='inner')
aa = aa[['fund_code_d','fund_name_d','fund_type_d','f_info_windcode_y','f_info_status_y','level1_type_y']]
aa = aa.rename(columns={'f_info_windcode_y':'f_info_windcode','f_info_status_y':'f_info_status','level1_type_y':'level1_type'})

aa_copy = aa.copy()
aa_copy = aa_copy.set_index('fund_code_d',drop=True)
dt_copy = dt_copy.set_index('fund_code_d',drop=True)

# 这里需要注意字典在update时 会根据key更新全部的,所以用来更新的表应该与被更新的表columns一样
dtt = dt_copy.to_dict(orient='index')
aat = aa_copy.to_dict(orient='index')
dtt.update(aat)    # dtt数据是合并了daixiao表中在ChinaMutualFundDescription表能查到的  

这样更新字典之后,还需要把更新后的字典再返回原样DataFrame,用from_dict函数

aa = pd.DataFrame.from_dict(dtt,orient='index',columns=['fund_name_d','fund_type_d','f_info_windcode','f_info_status','level1_type'])
aa = aa.reset_index().rename(columns={'index':'fund_code_d'})
aa.head()  

 这样就达到了目的。

原文地址:https://www.cnblogs.com/xiaodongsuibi/p/11722260.html