我要分析来自CMS(Medicare)的Excel电子表格,并已使用熊猫成功将其导入到数据框中。不幸的是,列名不是统一的,许多是相似的,但是由于随机空格,换行或其他信息而有所不同。示例:
OR
我只是简单地pandas: Merge two columns with different names?单独更改列的名称,但是我有超过350列,并且很有可能它们的列名称将来会更改。
有些想法是使用正则表达式来创建与名称匹配的案例,但是我发现很难捕获所有案例,并且有可能在将来遇到新案例。另一个想法是使用NLP软匹配列。
有任何建议或图书馆吗?谢谢!
答案 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