组合多个具有相似名称的excel文件

时间:2018-04-13 17:04:16

标签: pandas concat

我有一个关于将多个excel文件组合在一起的一般性问题。通常,我会使用pd.read_excel读取文件然后连接加入。但是,我有些情况下字段名称不完全相同但相似。例如,

一张工作表会有以下字段:Apple,Orange,Size,Id

另一张纸将是:苹果,橙色,尺码,#

我使用了重命名列功能但是我必须检查并比较每个文件中的每个名称。我想知道是否有任何方法可以在不通过所有字段名称的情况下将它们组合在一起。任何想法?谢谢!

1 个答案:

答案 0 :(得分:1)

定义两个字符串相同的含义,然后你可以自动重命名(你还需要确定字符串的“规范”形式 - 你将实际使用的名称最终的数据框)。这个问题很普遍,所以你必须根据你愿意考虑的列名来决定,但是一个简单的事情可能是使用这样的函数:

def compare_columns(col1: str, col2: str) -> bool:
    return col1.lower() == col2.lower()

在这里你要说的是,任何两个具有相同名称的列都具有相同的差异。您可能希望将列的规范形式定义为全小写字母。

实际上,现在我考虑一下,因为无论如何你都需要一个规范形式的列名,最简单的方法可能是,而不是比较名称,只是将所有名称转换为规范形式,然后像通常。在此处的示例中,您将所有数据框的所有列重命名为小写版本,然后它们将正确合并。

困难的部分将决定将变换应用于每个名称以使其成为规范形式。您所做的任何转换都存在组合数据的风险(即使只是改变案例),因此您需要根据您对列名的期望来自行决定更改是否合理。

正如@ako所说,你也可以用Levenstein距离来做这件事,但我认为这比仅确定一组用于每个列名的变换要复杂一些。对于Levenstein或类似的,您需要确定要重命名的名称,但是您还必须跟踪映射到该名称的所有名称,并在决定是否使用新名称时计算该组中最近成员之间的Levenstein距离映射到该规范名称(例如,假设您有“Apple”和“Aple”和“Ale”,并且合并名称与编辑距离为1或更小。“Apple”和“Aple”应合并,“Aple”应该合并和“Ale”。“Apple”和“Ale”通常不应该(因为它们的距离是2),但是因为它们都与“Aple”合并,所以它们现在也相互融合。

您还可以查看自动更正以尝试将“Aple”之类的内容转换为“Apple”而无需“Ale”也可以合并;我确定在Python中有一些用于执行自动更正的库。此外,还有一些NLP工具可以帮助你,如果你想做干事试图合并像“苹果”和“苹果”这样的东西。

但这一切都很棘手。降低外壳可能有用,但=)