2017-10-19 32 views
1

假設我有以下的(例如)數據幀:Python的數據幀:刪除的行受到多重條件

a b c d e 
0 9 9 0 9 9 
1 1 2 1 9 9 
2 8 8 0 2 3 
3 7 7 0 7 8 
4 1 2 0 3 4 
5 6 2 3 6 6 
6 1 2 0 1 2 
7 1 3 0 1 2 

還假設我已經生成索引的(任意的)列表中,例如[3,4]。對於列表中的每個元素,我想刪除從數據幀中的所有行具有在列中的相同的值「A」 列「B」爲行3和4

由於行3具有a = 7和b = 7,並且沒有其他行具有a = 7和b = 7,只有第3行被刪除。

由於行4具有= 1和b = 2,並且行1和6還具有一個= 1且b = 2,I下降行4,1和6。

所以所得到的數據幀將看起來像這樣:

a b c d e 
0 9 9 0 9 9 
1 8 8 0 2 3 
2 6 2 3 6 6 
3 1 3 0 1 2 

有誰知道如何拿出一個解決方案來做到這一點(用於更大的數據幀)?謝謝。

回答

1

利用numpybroadcasting;在索引

  • 提取值和loc和它重塑到3D陣列:

    df.loc[indices,cols].values[:,None]

  • 與列ab比較它,這將比較行3和4與所有其他行因爲尺寸不匹配和廣播式廣播

    df[cols].values == df.loc[indices,cols].values[:,None]

  • 使用.all(2)確保兩列匹配,並any(0)獲得比賽的任何一列3或第4行

  • 取反~和降匹配的行

給出:

indices = [3,4] 
cols = ['a','b'] 
df[~(df[cols].values == df.loc[indices,cols].values[:,None]).all(2).any(0)] 

# a b c d e 
#0 9 9 0 9 9 
#2 8 8 0 2 3 
#5 6 2 3 6 6 
#7 1 3 0 1 2 
+1

這工作完美,謝謝 –