【问题标题】:How can I compare the rows of two CSV files based on the similarities in them?如何根据它们的相似性比较两个 CSV 文件的行?
【发布时间】:2020-09-10 12:06:56
【问题描述】:

file1.csv 看起来像:

file2.csv 看起来像:

所需的输出是“更新的 file2.csv”:

file1.csv 仅供参考,不得更改。 应重新排列 file2.csv 中的行,使 file1.csv 中的每一行对应于 file2.csv 中的每一行(基于值的相似性),如共享的图像所示。 如果 file2.csv 中有 extra 行与 file1.csv 中的任何行都不相似,则可以将其删除(请记住,file1.csv 中的行数应等于更新后的行数) csv 文件。)。

【问题讨论】:

  • 我已经在我的系统上安装了所有这些版本的python。
  • 你能告诉我应该比较哪些值吗?是细胞类型还是什么?
  • 所有值都必须进行比较(cell_type,xmin,xmax,ymin,ymax)
  • 例如,file1.csv 中的 2nd row 的值为 RBC、378、489、278 和 374,而 file2.csv 的 15th row 的值相似 b> RBC、376、487、282 和 370。因此,在更新后的文件中,第 15 行必须移至第 2 行的位置。
  • 应该如何比较成对的值? “相似”到底是什么意思?

标签: python python-3.x python-2.7 csv


【解决方案1】:

在这种情况下只需使用循环。我认为只需要比较您的数据的 1 列(例如比较 min_x 列),因为我看到您的数据对于每列看起来都相似(我的意思是每列与其他表相比具有相似的差异值)。所以你可以做这样的循环:

import pandas as pd
data1 = pd.read_csv('file1.csv',sep=';') # change the separator to the separator used
data2 = pd.read_csv('file2.csv',sep=';')
df_output = pd.DataFrame()
variable_want_to_compare = 'xmin'
for i in range(len(data1)):
    a = data1[variable_want_to_compare].iloc[i]
    for j in range(len(data2)):
        b = data2[variable_want_to_compare].iloc[j]
        if abs(a-b)<5: # tolerance of value differences
            df_output = df_output.append(data2.iloc[j],ignore_index=True)

我不比较每一列,因为数据排序会很复杂。如果要对每一列进行排序,只需添加更多循环。但我认为您不需要它,因为每列的价值差异看起来相似(来自您的样本)。

【讨论】:

    【解决方案2】:

    为了便于编码和计算速度,你可以采取的做法是:首先,将每一列的值变成一个列表(你可以使用pandas库)。例如:

    import pandas as pd
    
    dataset_1 = pd.read_csv('/PATH/FILE1.csv')
    dataset_2 = pd.read_csv('/PATH/FILE2.csv')
    
    x_min_1 = dataset_1['xmin'].values.tolist()
    x_min_2 = dataset_2['xmin'].values.tolist()
    

    所以现在您已经将要比较的列转换为列表。现在取决于您想要做什么,有很多方法可以从目标列表中删除重复项,例如列表理解。如果您希望您的 x_min_2 仅包含 x_min_1 中已经存在的值,您可以进行列表理解:

    x_min_2 = [i for i in x_min_2 if i in x_min_1]
    

    与任何数据集中的任何其他列相比,您显然可以对您想要的任何列执行此过程。最后,您将使用新编辑的列表替换目标数据集列:

    dataset_2['xmin'] = pd.Series(x_min_2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多