【问题标题】:Removing rows with non-unique values across the columns in Pandas在 Pandas 的列中删除具有非唯一值的行
【发布时间】:2016-08-19 05:28:01
【问题描述】:

我有一个如下所示的数据框:

| id   | col1 | col2 | col3 | col4 |
|------|------|------|------|------|
| 1    | A    | B    | C    | 0    |
| 2    | M    | 0    | M    | 0    |
| 3    | B    | B    | 0    | B    |
| 4    | X    | 0    | Y    | 0    |

我想忽略在各自的列中只有一个唯一值的任何行。我最终会这样:

| id   | col1 | col2 | col3 | col4 |
|------|------|------|------|------|
| 1    | A    | B    | C    | 0    |
| 4    | X    | 0    | Y    | 0    |

这是一件看似简单的事情。但我似乎找不到任何关于如何在 Pandas 中执行此操作的提示,因为人们似乎最感兴趣的是删除与其他行重复的行,而不是那些在行本身中只有重复值的行。

df = [    {'id' : 1, 'col1' : 'A', 'col2': 'B', 'col3':   'C', 'col4':'0'},
          {'id' : 2, 'col1' : 'M', 'col2':   '0', 'col3': 'M', 'col4':'0'},
          {'id' : 3, 'col1' : 'B', 'col2':  'B', 'col3':  '0', 'col4':'0'},
          {'id' : 4, 'col1' : 'X', 'col2':  '0', 'col3':  'Y', 'col4':'0'}
          ]
df = pd.DataFrame(df)
df = df[['col1', 'col2', 'col3', 'col4']]
df

小记:值'0'在我的例子中实际上是一个字符串。
此时所有行都至少有一个值。

【问题讨论】:

    标签: pandas duplicates


    【解决方案1】:

    试试:

    df[df.apply(lambda x: x[x != '0'].nunique(), axis=1) > 1]
    


    'id'

    df.set_index('id')[df.set_index('id').apply(lambda x: x[x != '0'].nunique(), axis=1) > 1].reset_index()
    

    【讨论】:

    • 请原谅我——我在问题中犯了一个错误!实际上有第一列,带有id。啊。我觉得很难受。 (并且列是数字)
    • @MonicaHeddneck 我认为这是一个不可原谅的罪过
    • 我知道!!我在浪费别人的时间(他们比我聪明)!
    【解决方案2】:

    一种解决方案是查看转置的数据框并搜索重复项。

    你可以这样做:

    df.T.duplicated().any().T
    

    这将为您提供行重复的布尔系列,并使用该系列过滤您的数据框。

    【讨论】:

    • 嗯,我不想承认这一点..但我最初遗漏了这个问题。我忘了表明我确实有一个id 列......这是数字......对不起!
    • 使用通常的 set_index reset_index 模式来隔离您的 id 列并将其设置回数据框中
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    相关资源
    最近更新 更多