我有一个来自CMS (医疗保险)的Excel电子表格的集合,我想分析并成功地使用熊猫导入数据。不幸的是,列名并不是统一的,而且许多是相似的,但是由于随机空间、新行或额外的信息而有所不同。示例:
或
我只需单独更改列的名称pandas: Merge two columns with different names?,但我有超过350个列,而且很有可能它们的列名将来会改变。
有些想法是使用regex创建匹配名称的案例,但我发现很难捕捉到所有的案例,也很难在将来遇到新的案例。另一个想法是使用NLP软匹配列。
有什么建议或图书馆吗?谢谢!
发布于 2019-08-12 19:16:08
您可以使用内置于库中的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 ->合并)
发布于 2019-08-12 20:11:28
如果列是相同的,但标记有点不同,则可以手动创建一个标准列列表,并设置所有数据帧以使用这些列。也就是说,第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 datahttps://stackoverflow.com/questions/57466682
复制相似问题