2017-08-15 223 views
1

我有一個列索引to_delete,我想從兩個Pandas Dataframes,df1 & df2中刪除。他們都有500行。 to_delete有50個條目。 我運行此:試圖從Pandas Dataframe中刪除多行但刪除比預期更多的行

df1.drop(df1.index[to_delete], inplace=True) 
df2.drop(df2.index[to_delete], inplace=True) 

但是這導致在以各行250 DF1和DF2。它從每個刪除250行,而不是我想要的50個特定行...

to_delete按降序排列。

完整的方法:

def method(results): 
    #results is a 500 x 1 matrix of 1's and -1s 
    global df1, df2 
    deletions = [] 
    for i in xrange(len(results)-1, -1, -1): 
     if results[i] == -1: 
     deletions.append(i) 
    df1.drop(df1.index[deletions], inplace=True) 
    df2.drop(df2.index[deletions], inplace=True) 

任何建議,我在做什麼錯?

(我也用.iloc代替.index和刪除在if statement,而不是追加到列表中第一次嘗試。

+0

如果DF的索引不是唯一的(例如'數據= pd.DataFrame(np.arange(12).reshape(4,3),列= [ 'A', 'B', 'C' ],index = [1,1,2,3])'),然後'data.drop(data.index [[1,2]],inplace = True)'會刪除三行,即使你已經通過只有兩個指標下降。 –

回答

1

你的索引值不是唯一的,當您使用drop它是消除那些所有行索引值。to_delete可能已經長度50但有250行的是那些具有特定索引值。

考慮例如

df = pd.DataFrame(dict(A=range(10)), [0, 1, 2, 3, 4] * 2) 

df 

    A 
0 0 
1 1 
2 2 
3 3 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

假設您想要刪除第一行,第三行和第四行。

to_del = [0, 2, 3] 

用你的方法

df.drop(df.index[to_del]) 

    A 
1 1 
4 4 
1 6 
4 9 

這是一個問題


選項1
使用np.in1d找到to_del
補充這是更自我解釋比日其他人。我正在查看從0n的數組,看看它是否在to_del。結果將是一個與df長度相同的布爾數組。我使用~來取反,並使用它來分割數據幀。

df[~np.in1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

選項2
使用np.bincount找到to_del
補充這通過計算to_del邊界的位置來完成同樣的事情,選擇1。我最終得到了一個01的數組,其中在to_del0其他地方定義的每個位置都有一個1。我想保留0 s,所以我通過查找它等於0的位置來創建布爾數組。然後我用它來分割數據幀。

df[np.bincount(to_del, minlength=len(df)) == 0] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

選項3
使用np.setdiff1d找到位置
它使用設置邏輯找到位置的全陣列,只是我想刪除的那些之間的區別。然後我使用iloc進行選擇。

df.iloc[np.setdiff1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 
+0

謝謝,你的建議奏效!與選項2,但我不明白它實際上在做什麼。你能解釋一下嗎?另外,出於好奇,我使用pd.read_csv來獲取我的數據框,那麼索引如何不唯一?我從來沒有設置過任何東西,我只是假設索引基本上只是行號? (對不起,我是Python新手(約3周))。 – MahDhan

+0

我已經添加了一些評論。希望有所幫助。 – piRSquared

+0

@MahDhan關於索引唯一性。這是我能想象你的情況如何發生的唯一方式。讀取csv時,可以將該文件的一部分用作索引。它可能不是唯一的。此外,當你提問時。當你提供一個造成你問題的例子時,我們更喜歡它。這樣,我們消除了含糊不清的情況,並讓所有參與者都能更輕鬆地獲得所需。 – piRSquared