2016-09-22 78 views
1

我需要查看列['b']中的所有行,如果該行不是空的,請轉到另一個相應的列['c']並刪除此特定的重複項索引針對第三列['c']中的所有其他行,同時保留此特定索引。我遇到了drop_duplicates,但是我無法找到一種方法來查找突出顯示的行的重複項,而不是列中的所有重複項。我不能在整個列上使用drop_duplicates,因爲我想在此列中保留可能對應於列['b']中的空值的重複項。如果在['b']中找到非空值,則可以轉到['c']中的當前索引並找到該索引的所有重複項並將其刪除。這些重複項可以對應['b']中的空或非空值。如果在['b']中找到空值,則跳至下一個索引。通過這種方式,可能會間接移除['b']中的空值索引,因爲它們是['c']中與非空[[b']值對應的索引的重複項。python pandas如何有選擇地刪除重複項

編輯樣本數據:

預處理的:

df1 = pd.DataFrame([['','CCCH'], ['CHC','CCCH'], ['CCHCC','CNHCC'], ['','CCCH'], ['CNHCC','CNOCH'], ['','NCH'], ['','NCH']], columns=['B', 'C']) 

df1 

    B  C 
0   CCCH 
1 CHC CCCH 
2 CCHCC CNHCC 
3   CCCH 
4 CNHCC CNOCH 
5   NCH 
6   NCH 

後處理和刪除正確的重複:

df2 = pd.DataFrame([['CHC','CCCH'], ['CCHCC','CNHCC'], ['CNHCC','CNOCH'], ['','NCH'], ['','NCH']], columns=['B', 'C']) 

df2 

    B  C 
1 CHC CCCH 
2 CCHCC CNHCC 
4 CNHCC CNOCH 
5   NCH 
6   NCH 

上面我們看到的結果是刪掉了唯一的行是行0, 3,因爲它們在行1的列['C']中具有非零「B」值的副本。儘管第5,6行在列['C']中彼此重複,因爲它們沒有非零的'B'值。行2和行4保留,因爲它們不是列['C']中的重複項。

所以邏輯將是通過'B'列中的每一行,如果它是空的,然後向下移動並繼續。如果它不是空的,則轉到相應的列'C'並刪除該列'C'行的所有副本,同時保留該索引,然後繼續到下一行,直到此邏輯已應用於'B'列中的所有值」。

B列值爲空 - >看看列B中的下一個值

|或者如果不是空的|

B列不爲空 - > C欄 - >刪除C列的該索引的所有副本,同時保持當前索引 - >查找在B列下一個值

+3

能否請您提供一些數據樣本? (http://stackoverflow.com/help/mcve) – Thanos

+1

And:[如何製作好重現熊貓的例子](http:// stackoverflow。問題/ 20109391 /如何製作好可重現的熊貓示例) – IanS

+0

用數據示例編輯 – lucas305

回答

0

說你根據你的組數據框到'C'列,檢查各組一個'B' -column非空項是否存在:

  • 如果沒有這樣的條目,返回整個組

  • 否則,返回組,爲'B'非空項,用副本掉落

在代碼:

def remove_duplicates(g):          
    return g if sum(g.B == '') == len(g) else g[g.B != ''].drop_duplicates(subset='B') 

>>> df1.groupby(df1.C).apply(remove_duplicates)['B'].reset_index()[['B', 'C']] 
     B  C 
0 CHC CCCH 
1 CCHCC CNHCC 
2 CNHCC CNOCH 
3   NCH 
4   NCH 
+0

這看起來非常有前途 - 謝謝!但是,我遇到了一些錯誤:'ValueError:標籤['level_1']不包含在axis'中。我運行它的方式是做df2 = df1.groupby ......是不正確的? – lucas305

+0

@ lucas305不知道你爲什麼得到那個,但是帶有'level_1'的部分在任何情況下都是多餘的,我將它刪除了。你可以根據上面的更新再試一次嗎? –

+0

好的!運行沒有錯誤。然而,這並不是我需要的輸出 - 信息丟失太多了。因此,在原始df中,每行都由與該行中特定數據相對應的分子標識符進行索引。由於索引現在只是從0到n的整數,轉換後就會丟失。此外,新的DFF轉換隻有列B和C所有其他列已被刪除。我需要保留所有其他信息。基本上這應該只能刪除重複,但保持其他一切。 – lucas305