簡體   English   中英

使用python在數據框的某些列中刪除具有相同值的行

[英]Drop rows with same value in some columns in dataframe using python

我有一個包含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')

但是代碼沒有用。 代碼中有什么我想念的嗎?

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

您可以在最后四個位置找到唯一值的數量,並過濾大於該數量的數字。

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

您可以使用查詢,但需要輸入列的名稱:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM