zoukankan      html  css  js  c++  java
  • 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()  

     这样就达到了目的。

  • 相关阅读:
    parse_str — 将字符串解析成多个变量
    HTTP 协议入门
    Ruby自动文档工具 RDoc 3.3 发布 狼人:
    用好IE9浏览器必须要知道的九件事 狼人:
    微软缘何认为VB与C#需要异步语法 狼人:
    微软资深软件工程师:阅读代码真的很难 狼人:
    20款Web应用:可以替代桌面软件 狼人:
    互联网公司完善商业模式需完成七件事情 狼人:
    改良程序需要的11个技巧 狼人:
    开源网站建设工具Drupal 7发布 狼人:
  • 原文地址:https://www.cnblogs.com/xiaodongsuibi/p/11722260.html
Copyright © 2011-2022 走看看