【问题标题】:Pandas identify all rows in column 1 where duplicates occur in columns 2,3Pandas 识别第 1 列中的所有行,其中第 2,3 列中出现重复
【发布时间】:2021-12-02 22:59:19
【问题描述】:

我正在尝试从 Python 中的 Pandas DataFrame 中删除重复条目。 DataFrame 由多个 *.csv 文件的垂直连接内容组成。这是数据框:

print(df)

     file    TestA    TestB
  One.csv     7513   -643.1
  One.csv    15347      NaN
  One.csv      NaN     22.7
  One.csv    46321      NaN
  One.csv      NaN    156.1
  One.csv     2477     52.7
  Two.csv      417   1473.5
  Two.csv     7513   -643.1
  Two.csv    15347      NaN
  Two.csv      NaN     22.7
  Two.csv    46321      NaN
  Two.csv      NaN    156.1
Three.csv    -4341      NaN
Three.csv    34473      437
Three.csv     1349      NaN
 Four.csv       17      NaN
 Four.csv      107      NaN
 Four.csv     -931    44536
 Four.csv     6285      NaN
 Four.csv      119    34722

我想做以下事情: 一个。类似:

print(
    f"Rows {[1,2,3,4,5]} of {'One.csv'} are duplicated in rows {[2,3,4,5,6]} of "
    f"{'Two.csv'}. Rows from {'One.csv'} will now be removed "
)

我想要print 语句的这个结果:

Rows [1,2,3,4,5] of One.csv are duplicated in rows [2,3,4,5,6] of Two.csv. Rows from One.csv will now be removed from the DataFrame.

我不确定如何识别行并在 print 语句中设置它们。

有没有办法通过列号 1 (FileName) 的行号来识别重复的行?

编辑: 要创建 DataFrame df,请从此处选择 DataFrame 并将其复制到剪贴板。然后使用这个:

import pandas as pd
df = pd.read_clipboard()
print(df)

【问题讨论】:

    标签: python pandas duplicates dataframe


    【解决方案1】:

    不确定您究竟要打印什么,但您可以使用groupby 识别重复的行:

    In [169]: g = df.groupby(['TestA', 'TestB'])
    In [170]: g.groups
    Out[170]: 
    {(-4341.0, nan): [12L],
     (-931.0, 44536.0): [17L],
     (17.0, nan): [15L],
     (107.0, nan): [16L],
     (119.0, 34722.0): [19L],
     (417.0, 1473.5): [6L],
     (1349.0, nan): [14L],
     (2477.0, 52.7): [5L],
     (6285.0, nan): [18L],
     (7513.0, -643.1): [0L, 7L],
     (15347.0, nan): [8L],
     (34473.0, 437.0): [13L],
     (46321.0, nan): [3L],
     (nan, 22.7): [9L],
     (nan, 156.1): [4L],
     (nan, 156.1): [11L],
     (15347.0, nan): [1L],
     (nan, 22.7): [2L],
     (46321.0, nan): [10L]}
    

    然后您可以选择要删除哪些

    【讨论】:

    • 嗨,我已经在原始帖子中添加了我希望 print 输出的内容。我想在FileName 列的 2` *.csv` 文件名中找到重复行号的列表。在One.csv 我想要一个指示[1,2,3,4,5] 的列表,在Two.csv 我想要一个指示[2,3,4,5,6] 的列表。
    【解决方案2】:

    我将不得不发布我尝试过的内容,希望它能在这里有所作为:

    1.这给了我重复的内容:

    duplicates = df[df.columns[1:]].duplicated()
    

    2.这给了我一个包含重复条目的文件列表:

    files = df[duplicates==True]['file'].unique().tolist()
    

    3.这会打印一条接近我想要的消息,但不完全是我想要的:

    print('Rows of ' + ", ".join(["%s"]*len(files)) + 'are duplicated. These rows will now be removed from the dataframe.' % tuple(files))
    

    打印语句丢失:

    1. 每个文件的行号 - One.csv 缺少 [1,2,3,4,5]
    2. Two.csv 的行号 [2,3,4,5,6]

    如果有人可以找到将这些行号包含在打印语句中的方法(正如我在原始帖子中所描述的那样),那么这就是回答这个问题。

    【讨论】:

    • 我在下面的帖子中添加了进一步的评论,解释了所需的列表。我也将此添加到原始帖子中。如果需要任何其他信息,请随时告诉我。我想在打印行号(如上所述)方面获得一些帮助。
    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多