Làm cách nào để thả danh sách các hàng từ khung dữ liệu Pandas?


258

Tôi có một khung dữ liệu df:

>>> 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

Sau đó, tôi muốn thả các hàng với một số thứ tự nhất định được chỉ định trong một danh sách, giả sử ở đây là [1,2,4],bên trái:

                  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

Làm thế nào hoặc chức năng nào có thể làm điều đó?


chỉ cần làm rõ, câu hỏi này là về việc bỏ các hàng với các giá trị chỉ mục cụ thể .. việc sử dụng [1,2,4] của chúng là để chỉ đến các hàng còn lại sau khi thả. Có câu trả lời dưới đây làm điều này.
giả kim

Câu trả lời:


386

Sử dụng DataFrame.drop và truyền cho nó một loạt các nhãn chỉ mục:

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

18
Ngoài ra, Bỏ hàng cuối cùng df.drop (df.tail (1) .index)
Nasser Al-Wohaibi

15
Câu trả lời này chỉ hoạt động nếu df.index.unique () giống với df.index, đây không phải là một yêu cầu cho Pandas DataFrame. Có ai có giải pháp khi giá trị df.index không được đảm bảo là duy nhất không?
J Jones

2
điều này không cho phép bạn lập chỉ mục trên chính tên chỉ mục
ingrid

45
Ví dụ, nếu bạn muốn rõ ràng, vui lòng không sử dụng cùng một chuỗi cho các hàng và cột. Điều đó tốt cho những người thực sự biết công cụ của họ. Thất vọng cho những người cố gắng học hỏi.
gseatussy

2
người mới sử dụng python: lưu ý rằng nếu bạn muốn thả các hàng này và lưu chúng trong cùng một khung dữ liệu (tại chỗ), bạn cũng cần thêm axis=0(0 = hàng, 1 = cột) và inplace=Truenhư trong df.drop(df.index[[1,3]], axis=0, inplace=True). @mezzanaccio, nếu bạn biết cụ thể bạn muốn thay thế chỉ mục nào (và cũng sử dụng ví dụ từ 0 đến n của bạn):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT


47

Nếu DataFrame là rất lớn và số lượng hàng giảm cũng lớn, thì việc giảm chỉ số đơn giản df.drop(df.index[])sẽ mất quá nhiều thời gian.

Trong trường hợp của tôi, tôi có một DataFrame đa chỉ mục của các float 100M rows x 3 colsvà tôi cần xóa 10kcác hàng khỏi nó. Phương pháp nhanh nhất tôi tìm thấy là, hoàn toàn trái ngược với takecác hàng còn lại.

Hãy indexes_to_droplà một mảng các chỉ mục vị trí để thả ( [1, 2, 4]trong câu hỏi).

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

Trong trường hợp của tôi, điều này mất 20.5s, trong khi đơn giản df.dropđã chiếm 5min 27svà tiêu tốn rất nhiều bộ nhớ. DataFrame kết quả là như nhau.


43

Bạn cũng có thể vượt qua để DataFrame.drop các nhãn riêng của mình (thay vì loạt các nhãn index):

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

Tương đương với:

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]) cũng hoạt động. ý tôi là, không cần đôi vuông_brackets (ít nhất là với gấu trúc 0.18.1)
tagoma

23

Tôi đã giải quyết điều này một cách đơn giản hơn - chỉ trong 2 bước.

Bước 1: Đầu tiên hình thành một khung dữ liệu với các hàng / dữ liệu không mong muốn.

Bước 2: Sử dụng chỉ mục của khung dữ liệu không mong muốn này để thả các hàng khỏi khung dữ liệu gốc.

Thí dụ:

Giả sử bạn có một khung dữ liệu df có nhiều cột bao gồm 'Tuổi' là số nguyên. Bây giờ, giả sử bạn muốn thả tất cả các hàng có 'Tuổi' làm số âm.

Bước 1: df_age_negative = df [df ['Tuổi'] <0]

Bước 2: df = df.drop (df_age_negative.index, trục = 0)

Hy vọng điều này là đơn giản hơn nhiều và giúp bạn.


1
+1, đây là câu trả lời duy nhất cho bạn biết cách xóa một hàng chọn một cột khác với cột đầu tiên.
Alejo Bernardin

10

Nếu tôi muốn thả một hàng có chỉ số giả sử x, tôi sẽ làm như sau:

df = df[df.index != x]

Nếu tôi muốn bỏ nhiều chỉ số (giả sử các chỉ số này có trong danh sách unwanted_indices), tôi sẽ làm:

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

6

Dưới đây là một ví dụ cụ thể, tôi muốn trình bày. Giả sử bạn có nhiều mục trùng lặp trong một số hàng của mình. Nếu bạn có các mục chuỗi, bạn có thể dễ dàng sử dụng các phương thức chuỗi để tìm tất cả các chỉ mục để thả.

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

Và bây giờ để loại bỏ các hàng bằng chỉ mục của chúng

new_df = df.drop(ind_drop)

3

Trong một bình luận cho câu trả lời của @ theodros-zelleke, @ j-jones đã hỏi về việc phải làm gì nếu chỉ số không phải là duy nhất. Tôi đã phải đối phó với một tình huống như vậy. Những gì tôi đã làm là đổi tên các bản sao trong chỉ mục trước khi tôi gọi drop(), a la:

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

trong đó rename_duplicates()một hàm tôi đã xác định đã đi qua các phần tử của chỉ mục và đổi tên thành các bản sao. Tôi đã sử dụng mô hình đổi tên giống như pd.read_csv()sử dụng trên các cột, tức là "%s.%d" % (name, count), nơi namelà tên của hàng và countlà bao nhiêu lần nó đã xảy ra trước đó.


1

Xác định chỉ số từ boolean như mô tả ở trên, vd

df[df['column'].isin(values)].index

có thể tốn nhiều bộ nhớ hơn là xác định chỉ mục bằng phương pháp này

pd.Index(np.where(df['column'].isin(values))[0])

áp dụng như vậy

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

Phương pháp này rất hữu ích khi xử lý các tệp dữ liệu lớn và bộ nhớ hạn chế.


0

Chỉ sử dụng Index arg để thả hàng: -

df.drop(index = 2, inplace = True)

Đối với nhiều hàng: -

df.drop(index=[1,3], inplace = True)

0

Xem xét một khung dữ liệu mẫu

df =     
index    column1
0           00
1           10
2           20
3           30

chúng tôi muốn giảm hàng chỉ số thứ 2 và thứ 3.

Cách tiếp cận 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

Cách tiếp cận 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.