![](/img/trans.png)
[英]Python pandas: Compare rows of dataframe based on some columns and drop row with lowest value
[英]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,您可以使用diff
和any
帶有布爾索引的方法:
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.