合并包含相同信息但列名略有不同的列

2024-03-29 09:49:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从CMS(医疗保险)Excel电子表格的收集,我想分析,并已成功地导入到一个数据框使用熊猫他们。不幸的是,列名不是统一的,而且许多列名是相似的,但是由于随机空格、新行或额外的信息而有所不同。示例:

  • “血管或循环系统疾病”
  • ‘血管或循环系统疾病(CC 104-106)’
  • “血管或循环系统疾病”

或者

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

我只想单独更改列的名称pandas: Merge two columns with different names?,但是我有超过350个列,它们的列名很有可能在将来更改。你知道吗

一些想法是使用regex来创建匹配名称的案例,但我发现很难捕获所有案例,而且将来可能会遇到新的案例。另一个想法是使用NLP来软匹配列。你知道吗

有什么建议或建议吗?谢谢您!你知道吗


Tags: 数据名称信息id示例cmsexcel建议
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

您可以使用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

使用它的输出,您可以设置特定级别的敏感度来合并列(即,如果output>;.5->;merge)

相关问题 更多 >