大熊猫合并包含相同信息但列名稍有不同的列

时间:2019-08-12 18:49:30

标签: python regex pandas

我要分析来自CMS(Medicare)的Excel电子表格,并已使用熊猫成功将其导入到数据框中。不幸的是,列名不是统一的,许多是相似的,但是由于随机空格,换行或其他信息而有所不同。示例:

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

OR

  • “ ID \ nNumber”
  • “ ID \ nNumber”
  • “身份证号码”

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

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

有任何建议或图书馆吗?谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用内置库中的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-> merge)

答案 1 :(得分: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