【问题标题】:Cross column search in pandas dataframe熊猫数据框中的跨列搜索
【发布时间】:2019-06-22 22:32:50
【问题描述】:

我有包含source_image_namedest_image_namescore 列的数据框。这些行有重复,其中source_image_namedest_image_name 中,反之亦然。我正在尝试消除这种情况。

我尝试过使用 iterrows() 和过滤器进行迭代。在搜索之前,我创建了图像名称的哈希并将它们存储在新列中。

示例数据框

|源图像 |目标图像 |分数 |

|-------------- |------------- |------- |

| image_1.jpg | image_2.jpg | 5 |

| image_2.jpg | image_1.jpg | 5 |

| image_3.jpg | image_4.jpg | 10 |

| image_4.jpg | image_3.jpg | 10 |

| image_3.jpg | image_5.jpg | 9 |

df["hash_source"] = df["source_image"] + df["dest_image"] 
df["hash_dest"] = df["dest_image"] + df["source_image"]    
df["is_delete"] = 0    
for idx,item in df.iterrows():
    # Set column value to mark the row for deletion
    if item["is_delete"] == "0":
        df[df["hash_dest"]==item["hash_source"]]["is_delete"] = 1

我期待找到一种有效的方法来识别这些行。我正在考虑为每个图像名称计算数字哈希并将它们添加到一列中以查找重复的行。但是我认为这样做会产生冲突。

输出数据帧

|源图像 |目标图像 |分数 |

|-------------- |------------- |------- |

| image_1.jpg | image_2.jpg | 5 |

| image_3.jpg | image_4.jpg | 10 |

| image_3.jpg | image_5.jpg | 9 |

【问题讨论】:

  • 您只是想让这些行消失吗?您的示例中显示的二进制关系是否保证所有重复的名称?
  • 我希望第一次出现的行消失。不幸的是,我没有看到整个数据集的二元关系。但是,如果有二进制的解决方案,我可以将非二进制的从数据帧中分离出来。
  • 所以假设第 1 行的 dest_image 与第 2 行的 source_image 同名,但第 2 行的 dest_image 与第 2 行的 source_image 同名1. 这种情况下的预期结果是什么?
  • 这是一个有效的行,我想保留在数据框中。我正在尝试识别sourcedest 倒置的行,以便我可以删除其中一个。我已经更新了附加文件名以进行比较的代码。

标签: python pandas search


【解决方案1】:

散列的想法是好的方向,但你不需要深入到散列。
按字典顺序连接 source_image 名称和 dest_image 名称就足够了。因此,如果这两个名称互换,则以相同的控制字符串结尾。然后您可以在控制列中搜索重复项并删除它们。

这应该是相当有效的:

def joinnames(x):
    return ''.join(sorted([x['source_image'], x['dest_image']]))

df['control'] = df.apply(joinnames, axis=1)
df['dupes'] = df.duplicated('control', 'first')
finaldf = df.loc[~df['dupes']]

使用提供的示例数据框,上述代码生成以下finaldf 数据框:

  source_image   dest_image  score                 control  dupes
0  image_1.jpg  image_2.jpg      5  image_1.jpgimage_2.jpg  False
2  image_3.jpg  image_4.jpg     10  image_3.jpgimage_4.jpg  False
4  image_3.jpg  image_5.jpg      9  image_3.jpgimage_5.jpg  False

现在您只需删除 'control''dupes' 列即可。

如果您不确定某些方法的工作原理,请查看以下资源:pandas.DataFrame.applypandas.DataFrame.duplicatepandas indexing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多