【问题标题】:Pandas merging columns that contain the same information, but slightly different column namesPandas 合并包含相同信息但列名略有不同的列
【发布时间】:2019-12-19 08:34:46
【问题描述】:

我有一组来自 CMS (Medicare) 的 Excel 电子表格,我想对其进行分析,并已使用 pandas 成功地将它们导入数据框。不幸的是,列名不是统一的,很多是相似的,但是由于随机空格、换行或额外信息而有所不同。示例:

  • '血管或循环系统疾病'
  • '血管或循环系统疾病 (CC 104-106)'
  • '血管或循环系统疾病'

  • 'ID\n编号'
  • 'ID \nNumber'
  • '身份证号'

我会简单地单独更改列的名称pandas: Merge two columns with different names?,但我有超过 350 列,并且很有可能它们的列名将来会更改。

一些想法是使用正则表达式来创建匹配名称的案例,但我发现很难捕获所有案例并且将来可能会遇到新案例。另一个想法是使用 NLP 来软匹配列。

有什么建议或图书馆吗?谢谢!

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    您可以使用内置库的 difflib 比较字符串之间的相似性:

    from difflib import SequenceMatcher
    
    def get_sim_ratio(x, y):
        return SequenceMatcher(None, x, y).ratio()
    
    print(get_sim_ratio('Vascular or Circulatory Disease', 'Vascular or Circulatory Disease (CC 104-106)'))
    print(get_sim_ratio('Endocrine Disease', 'Vascular or Circulatory Disease (CC 104-106)'))
    

    这个输出:

    0.8266666666666667
    0.36065573770491804
    

    使用它的输出,您可以设置一定程度的敏感度来合并列(即如果输出 > .5 -> 合并)

    【讨论】:

    • 感谢您的回答!我开始使用 FuzzyWuzzy 库,但会试一试。
    • 我最终使用了您提供的函数,并添加了 Token_sort_ratio、Token_set_ratio 以及敏感度级别来确定哪些列匹配。
    【解决方案2】:

    如果列相同,但标记稍有不同,您可以手动创建标准列列表并将所有数据框设置为使用这些列。也就是说,第 1 列始终是“ID 编号”的一些变体,而第 2 列始终是“血管或循环系统疾病”的一些变体,但在编码上有所不同。

    data_frames = []
    for file in files:
       df = pd.read_excel(f)
       df.columns = ['ID Number', 'Vascular or Circulatory Disease'] # and so forth
       data_frames.append(df)
    
    combined = pd.concat(data_frames)
    

    如果您有一组一致的列,除了某些文件末尾有更多列(例如,在某个时候添加或删除了列):

    def set_columns(data, columns):
        if len(data.columns) < len(columns):
            diff = len(data.columns) - len(columns)
            data.columns = columns[:diff]
            # Add missing columns
            for i in range(diff, 0):
                data[columns[i]] = np.nan
        else:
            data.columns = columns
        return data
    

    【讨论】:

    • 这很有帮助!每个文件都有一定数量的列,最后 20 列左右因文件而异。
    猜你喜欢
    • 2020-01-02
    • 2021-02-24
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多