2016-08-18 122 views
2

跨列非唯一的值刪除行我有一個數據幀,看起來像這樣:與熊貓

| 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 | 

這是一個看似簡單的事情要做。但是我似乎無法找到熊貓中如何做到這一點的提示,因爲人們似乎最感興趣的是刪除與其他行重複的行,而不是那些在行本身中只有重複值的行。

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'實際上是一個字符串在我的情況。
此時所有行都至少有一個值。

回答

2

嘗試:

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

enter image description here


隨着'id'

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

enter image description here

+0

請原諒我 - 我在這個問題上犯了一個錯誤!實際上有第一列,帶有「id」。啊。我感覺很糟糕。 (和列是數字) –

+0

@MonicaHeddneck接近不可饒恕的罪我認爲 – piRSquared

+0

我知道!我在浪費別人的時間(誰比我聰明)! –

0

一種解決方案是查看您的數據幀轉置和搜索重複。

你可以做這樣的事情:

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

這會給你的布爾系列行具有重複和這一系列過濾你的數據幀。

+0

恩,我討厭承認這個..但是我原來在這個問題上做了一個省略。我忘了證明我確實有一個'id'專欄......這是數字....對不起! –

+0

使用通常的set_index reset_index模式來隔離您的id列並將其設置回數據幀中 – Boud