【问题标题】:Drop rows with same value in some columns in dataframe using python使用python在数据框中的某些列中删除具有相同值的行
【发布时间】:2018-05-06 22:16:07
【问题描述】:

我有一个包含 5 列的数据框:文件名、#line_changed-hist、#line_changed-myers、#line_changed-min 和 #line_changed-pat,其中包含数千个数据。如果最后四列(所有 line_changed)具有相同的值,我想要做的是删除行。假设我的数据框名为“datamerge3:

filename                    #line_changed-hist #line_changed-myers #line_changed-min #line_changed-pat
---------------------------------------------------------------------------------------------------------------
.../util/HBaseFsck.java     1808                1806                1806              1806
.../hfile/HFileBlock.java   1036                1032                1032              1040
.../HConnectionManager.java  794                 772                 772               774
.../TestCompatibility.java   762                 762                 762               762
.../master/MockServer.java   605                 605                 605               605
.../TestRowEndpoint.java     598                 598                 598               598
.../TestHBaseFsck.java       576                 572                 572               572
.../TestEndLevel.java         11                   0                   0                 0

我需要删除最后四列 (#line_changed) 中具有相同值的所有行。例如数据编号 4、5 和 6。然后,将其保存到新的 csv 文件。这是我写的代码:

for nn in range(0,len(datamerge3)-1):
    dmhist = datamerge3.iloc[nn]['#line_changed-hist']
    dmmyers = datamerge3.iloc[nn]['#line_changed-myers']
    dmmin = datamerge3.iloc[nn]['#line_changed-min']
    dmpat = datamerge3.iloc[nn]['#line_changed-pat']
    if ((dmhist == dmmyers) and (dmhist == dmmin) and (dmhist == dmpat)):
        datamerge3.drop([nn])
    else:
        pass

datamerge3.to_csv('diff_file.csv')

但代码不起作用。代码中有我遗漏的东西吗?

【问题讨论】:

    标签: python pandas dataframe rows


    【解决方案1】:

    IIUC,您可以将diffany 与布尔索引一起使用:

    df[df.iloc[:,-4:].diff(axis=1).fillna(0).any(1)]
    

    输出:

                          filename  #line_changed-hist  #line_changed-myers  #line_changed-min  #line_changed-pat
    1      .../util/HBaseFsck.java              1808.0               1806.0             1806.0             1806.0
    2    .../hfile/HFileBlock.java              1036.0               1032.0             1032.0             1040.0
    3  .../HConnectionManager.java               794.0                772.0              772.0              774.0
    7       .../TestHBaseFsck.java               576.0                572.0              572.0              572.0
    

    【讨论】:

    • 对不起,我在数据框中添加了一个数据,最后一个数据应该在输出中。但事实并非如此。
    【解决方案2】:

    您可以在最后四个位置找到唯一值的数量,然后过滤大于一的数字。

    iloc

    df[df.iloc[:, -4:].nunique(1).gt(1)]
    
                          filename  #line_changed-hist  #line_changed-myers  #line_changed-min  #line_changed-pat
    0      .../util/HBaseFsck.java                1808                 1806               1806               1806
    1    .../hfile/HFileBlock.java                1036                 1032               1032               1040
    2  .../HConnectionManager.java                 794                  772                772                774
    6       .../TestHBaseFsck.java                 576                  572                572                572
    

    filter

    df[df.filter(regex='^#').nunique(1).gt(1)]
    
                          filename  #line_changed-hist  #line_changed-myers  #line_changed-min  #line_changed-pat
    0      .../util/HBaseFsck.java                1808                 1806               1806               1806
    1    .../hfile/HFileBlock.java                1036                 1032               1032               1040
    2  .../HConnectionManager.java                 794                  772                772                774
    6       .../TestHBaseFsck.java                 576                  572                572                572
    

    【讨论】:

      【解决方案3】:

      您可以使用query,但您需要输入列的名称:

      df.query("not(line_changed-hist == line_changed-myers and line_changed-hist == line_changed-min and line_changed-hist == line_changed-pat)")
      

      【讨论】:

        猜你喜欢
        • 2018-08-18
        • 2012-01-13
        • 2015-10-19
        • 1970-01-01
        • 2017-09-12
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多