2013-02-02 48 views
155

我有一個數據幀DF:如何從Pandas數據框中刪除行列表?

>>> df 
        sales discount net_sales cogs 
STK_ID RPT_Date          
600141 20060331 2.709  NaN  2.709 2.245 
     20060630 6.590  NaN  6.590 5.291 
     20060930 10.103  NaN  10.103 7.981 
     20061231 15.915  NaN  15.915 12.686 
     20070331 3.196  NaN  3.196 2.710 
     20070630 7.907  NaN  7.907 6.459 

然後我想刪除與該列表中顯示一定的序列號行,假設這裏是[1,2,4],然後離開:

    sales discount net_sales cogs 
STK_ID RPT_Date          
600141 20060331 2.709  NaN  2.709 2.245 
     20061231 15.915  NaN  15.915 12.686 
     20070630 7.907  NaN  7.907 6.459 

怎樣還是怎樣函數可以去做 ?

回答

232

使用DataFrame.drop,並通過它的索引標識的系列:

In [65]: df 
Out[65]: 
     one two 
one  1 4 
two  2 3 
three 3 2 
four  4 1 


In [66]: df.drop(df.index[[1,3]]) 
Out[66]: 
     one two 
one  1 4 
three 3 2 
+13

+1此外,刪除最後一行df.drop(df.tail(1).index) –

+8

@ NasserAl-Wohaibi可以使用df.ix [: - 1] – megabyde

+7

這個答案只適用於df .index.unique()與df.index相同,這不是熊貓數據框的要求。有沒有人有一個解決方案,當df.index值不保證是唯一的? –

28

您還可以傳遞給DataFrame.drop標籤本身(而不是系列的索引標識的):

In[17]: df 
Out[17]: 
      a   b   c   d   e 
one 0.456558 -2.536432 0.216279 -1.305855 -0.121635 
two -1.015127 -0.445133 1.867681 2.179392 0.518801 

In[18]: df.drop('one') 
Out[18]: 
      a   b   c   d   e 
two -1.015127 -0.445133 1.867681 2.179392 0.518801 

即相當於:

In[19]: df.drop(df.index[[0]]) 
Out[19]: 
      a   b   c   d   e 
two -1.015127 -0.445133 1.867681 2.179392 0.518801 
+1

df.drop(df.index [0])也適用。我的意思是,不需要雙重square_brackets(至少有熊貓0.18.1) – tagoma

1

在向@評論theodros-zelleke的回答,@ j-jones詢問如果索引不唯一,該怎麼辦。我不得不面對這樣的情況。我所做的是在指數重命名重複我叫drop()前,一拉:

dropped_indexes = <determine-indexes-to-drop> 
df.index = rename_duplicates(df.index) 
df.drop(df.index[dropped_indexes], inplace=True) 

其中rename_duplicates()是我定義的函數,通過指數的元素去,並更名爲重複。我使用了與pd.read_csv()在列上使用相同的重命名模式,即"%s.%d" % (name, count),其中name是該行的名稱,count是之前發生過的次數。

22

如果DataFrame很大,並且要刪除的行數也很大,那麼按索引df.drop(df.index[])進行簡單刪除會花費太多時間。

在我的情況下,我有一個多索引的浮動數據框與100M rows x 3 cols,我需要從它刪除10k行。我發現最快的方法是,相當直截了當,其餘的行是take

indexes_to_drop是一個位置索引數組丟失([1, 2, 4]在問題中)。

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop) 
df_sliced = df.take(list(indexes_to_keep)) 

在我的情況下,這個花了20.5s,而簡單df.drop5min 27s,並消耗大量的內存。生成的DataFrame是相同的。

2

如果我想刪除其中有假設指數x一排,我會做到以下幾點:

df = df[df.index != x] 

如果我想刪除多個索引(說這些指標都在名單unwanted_indices)我會這樣做:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices] 
desired_df = df.iloc[desired_indices] 
1

我以一種更簡單的方式解決了這個問題 - 僅需2步。

步驟1:首先用不需要的行/數據形成一個數據幀。

步驟2:使用此不需要的數據幀的索引刪除原始數據幀中的行。

例子:

假設你有一個數據幀DF其作爲多列,包括「時代」,這是一個整數。現在讓我們假設你想把所有的'Age'行作爲負數。

步驟1:df_age_negative = DF [DF [ '年齡'] < 0]

步驟2:DF = df.drop(df_age_negative.index,軸= 0)

希望這是更簡單的並幫助你。

相關問題