2016-03-16 113 views
1

我是熊貓新手,需要一些幫助從我的原始表中刪除符合特定條件的行。使用熊貓刪除一列的基於列的值

表1(原始表):

ID SerialNo calls 
1 171723 Blue 2 
2 171723 Green 3 
3 171723 Blue 4 
4 171723 Yellow 5 
5 171723 Blue 1 
6 171724 Green 1 
7 171724 Yellow 2 
8 171724 Green 3 
9 171724 Green 4 
10 171724 Green 5 
11 171724 Yellow 6 

Table1_mod(過濾表):

ID SerialNo calls 
1 171723 Blue 2 
2 171723 Green 3 
3 171723 Blue 4 
4 171723 Yellow 5 
5 171724 Green 1 
6 171724 Yellow 2 
7 171724 Green 3 
8 171724 Green 4 
9 171724 Green 5 
10 171724 Yellow 6 

欲獲得基於修改後的表中的下列:

ID列包含唯一數字。例如,對於所有具有'171723'的行,並且在'SerialNO'列下,我對'Blue'感興趣。所以我想刪除'171723'的最後一行,因爲藍色(SerialNo列)有一行對應於'1'(調用列)小於'2'的行(第一次出現藍色調用列'171723' )

如何編寫熊貓代碼來刪除滿足這些條件的行?

感謝

回答

1

我認爲你可以一口氣做到這一點申請和一個單獨的字典,以跟蹤您的最大呼叫價值。這也涉及這樣的事實,我認爲你想拋出任何行,其中呼叫號碼低於該ID,SerialNo組合的任何先前行。

max_dict = {} 

def keep_row(row): 
    if row.calls > max_dict.get((row.ID, row.SerialNo), 0): 
     max_dict[(row.ID, row.SerialNo)] = row.calls 
     return True 
    else: 
     return False 

Table1_mod = Table1[Table1.apply(keep_row, axis=1)] 
+0

沒問題。如果你需要多次運行它(或在多個數據幀上),你需要重新初始化字典以將其清空或者將字典和函數封裝在閉包中,但對於你的問題來說似乎過度。 – tvashtar

1

只是爲了澄清:你想看看ID號碼組,發現「藍」中的序列號列中第一次出現,並刪除任何其他行這個羣裏的序列號與也藍色和調用值小於第一個「藍色」行中的調用值?

我會第一組的數據幀由編號

id_groups = Table1.groupby('ID') 

然後定義一個函數來完成你的過濾:

def blue_filter(group): 
    blues = group[group['SerialNo'] == 'Blue'] 
    try: 
     first_blue_call = blues['calls'].iloc[0] 
    except: 
     return group 
    return group[(group['SerialNo'] != 'Blue') | (group['calls'] >= first_blue_call)] 

現在申請該功能的網上論壇和改革團體作爲新的數據幀並重置指數

Table1_mod = id_groups.apply(blue_filter) 
Table1_mod.index = Table1_mod.index.levels[1] 
+0

非常感謝@bunji。你對我想要的東西的解釋是完美的。我運行了代碼,但不知何故,它在最後一條語句中拋出了一個錯誤(KeyError:0):Table1_mod = id_groups.apply(blue_filter)。它看起來像一個索引錯誤。 – user27976

+0

@ user27976你是完全正確的。我的代碼沒有處理組中未出現「藍色」的情況。我用try/except塊更新了它。我還修復了一個語法錯誤,並添加了一些內容來重置您的索引,以便輸出與您指定的一樣。 – bunji

+0

它現在有效。感謝您的幫助和時間。 – user27976

相關問題