【问题标题】:combine multiple excel files with similar names合并多个名称相似的excel文件
【发布时间】:2018-09-24 02:35:47
【问题描述】:

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

一张表将包含以下字段:Apple、Orange、Size、Id

另一张纸是:Apples, orange, Sizes, #

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

【问题讨论】:

  • 了解文件中的内容几乎没有什么好的捷径。如果您有数千个字段,您希望匹配非常相似的名称(可能使用 Levenshtein 距离)。但即使在这里,你对误报匹配的容忍度是多少?还是相反?这个问题只有知道了才能回答。否则,如果字段计数很短,则循环并打开文件,并将它们的名称存储在字典中,目的是创建现有字段名称的全局映射。
  • 谢谢!我也是这么想的,但只是好奇是否有一些我不知道的新功能:)
  • @RCA 不完全是因为我只想将它们堆叠在一起而不是加入

标签: pandas concat


【解决方案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 中进行自动更正。此外,如果您想进行词干提取以尝试合并“Apples”和“Apple”之类的内容,还有一些 NLP 工具可以帮助您。

但这一切都会很棘手。不过,小写的东西可能有效 =)

【讨论】:

  • 感谢您的建议和详细的描述。非常有帮助:)
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2022-01-09
  • 2019-04-06
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多