【问题标题】:Pandas: How can I remove duplicates with single column different values, while retaining said different valuesPandas:如何删除具有单列不同值的重复项,同时保留所述不同值
【发布时间】:2021-09-14 15:21:45
【问题描述】:

我看过这个question,但我无法理解它的含义。它与旋转数据框后将多个索引展平为单个索引有关。

我目前正在处理图像,并且我有一个包含重复行的数据框,但是,每个重复行都有不同的“主题”值。

目标

我想删除这些重复的行,即使它们具有不同的值,并将所有重复项中的所有不同值合并到一个列中,即Aortic enlargement|Pulmonary fibrosis|Atelectasis

问题

这本质上是一个多部分的问题。

  1. 我怎样才能达到上述目标?

  2. 有人可以用蹩脚的语言解释我所链接的问题以完全理解它吗?

额外信息:

我有一个mock csv file,如果您需要完全理解我的意思,可以访问它。

【问题讨论】:

  • 哪些行重复???您认为哪些列是重复行?也许 (16, 57) 和 (35, 65) 列在class_name 的右侧
  • image_id 列中我复制了行。我有 15k 图片,但行数为 67k+。每个图像 id 在label col 中都有一个独特的疾病。所以我想删除所有这些重复并制作如下标签:img_id label 0001 fibrosis |我想要这样的肺不张
  • 好吧,也许你应该更新你的帖子。
  • 它更新的兄弟有人更新它
  • 另一个问题:应该删除其他列吗?输出只包含 2 列:image_idclass_name,对吗?

标签: python pandas dataframe csv


【解决方案1】:

将此数据框视为 MRE:

>>> df
                           image_id          class_name
0  47ed17dcb2cbeec15182ed335a8b5a9e         Nodule/Mass  # <- dup 1
1  47ed17dcb2cbeec15182ed335a8b5a9e  Aortic enlargement  # <- dup 1
2  47ed17dcb2cbeec15182ed335a8b5a9e  Pulmonary fibrosis  # <- dup 1
3  7c1add6833d5f0102b0d3619a1682a64        Lung Opacity  # <- dup 2
4  7c1add6833d5f0102b0d3619a1682a64  Pulmonary fibrosis  # <- dup 2
5  5550a493b1c4554da469a072fdfab974          No finding  # <- dup 3
6  5550a493b1c4554da469a072fdfab974          No finding  # <- dup 3

要获得预期结果,您需要按image_id 对行进行分组,并将来自class_name 的所有值连接在一起并用' | ' 分隔:

>>> df.groupby('image_id')['class_name'].apply(lambda x: ' | '.join(sorted(set(x))))

image_id
47ed17dcb2cbeec15182ed335a8b5a9e    Aortic enlargement | Nodule/Mass | Pulmonary f...
5550a493b1c4554da469a072fdfab974                                           No finding
7c1add6833d5f0102b0d3619a1682a64                    Lung Opacity | Pulmonary fibrosis

使用set 删除相同image_idclass_name 重复项,并使用sorted 获得class_name 字典顺序。

更新

您可以使用MultiIndex 正确显示重复的行。试试:

>>> df.set_index(['image_id', 'class_name']).sort_index()

                                             class_id rad_id  x_min  y_min  x_max  y_max  width  height
image_id                         class_name
000434271f63a053c4128a0ba6352c7f No finding        14     R6    NaN    NaN    NaN    NaN   2336    2836
                                 No finding        14     R2    NaN    NaN    NaN    NaN   2336    2836
                                 No finding        14     R3    NaN    NaN    NaN    NaN   2336    2836
00053190460d56c53cc3e57321387478 No finding        14    R11    NaN    NaN    NaN    NaN   1994    2430
                                 No finding        14     R2    NaN    NaN    NaN    NaN   1994    2430
...                                               ...    ...    ...    ...    ...    ...    ...     ...
fff0f82159f9083f3dd1f8967fc54f6a No finding        14     R9    NaN    NaN    NaN    NaN   2048    2500
                                 No finding        14    R14    NaN    NaN    NaN    NaN   2048    2500
fff2025e3c1d6970a8a6ee0404ac6940 No finding        14     R1    NaN    NaN    NaN    NaN   1994    2150
                                 No finding        14     R5    NaN    NaN    NaN    NaN   1994    2150
                                 No finding        14     R2    NaN    NaN    NaN    NaN   1994    2150

[67914 rows x 8 columns]

【讨论】:

  • 您是否将其应用于提供的数据?还是它的虚拟数据?
  • 关于虚拟数据,因为在您的 csv 文件中,没有 image_id dups。输入 70 行,输出 70 行。
  • 我没有得到确切的输出。我更新了文件,你能再检查一遍吗?
  • 使用您的新数据:输入:67914 条记录 -> 输出:15000 条记录。
  • 像这样:out = df.groupby('image_id')['class_name'].apply(lambda x: ' | '.join(sorted(set(x)))).reset_index()
猜你喜欢
  • 2018-12-21
  • 2014-06-23
  • 2019-12-03
  • 1970-01-01
  • 2021-07-13
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多