Cách xóa hàng dữ liệu cuối cùng của khung dữ liệu gấu trúc


103

Tôi nghĩ điều này nên đơn giản, nhưng tôi đã thử một vài ý tưởng và không có ý tưởng nào trong số chúng hoạt động:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

Tôi đã thử sử dụng các chỉ số âm nhưng điều đó cũng dẫn đến lỗi. Chắc tôi vẫn đang hiểu sai điều gì đó cơ bản.


27
DF = DF[:-1]?
U2EF1

@ U2EF1 này sao chép toàn bộ tập dữ liệu, phải không? Khi xử lý dữ liệu lớn, điều này có thể là một vấn đề.
ManuelSchneid3r

Câu trả lời:


163

Để thả n hàng cuối cùng:

df.drop(df.tail(n).index,inplace=True) # drop last n rows

Theo cùng một mạch, bạn có thể thả n hàng đầu tiên:

df.drop(df.head(n).index,inplace=True) # drop first n rows

Để bỏ cột cuối cùng, bạn có thể sử dụng df.drop (df.columns [-1], axis = 1, inplace = True) hoặc nếu bạn biết tên của cột, bạn có thể sử dụng df.drop (column = ['col_name '], inplace = True) - nếu bạn không muốn nó được thực hiện tại chỗ, hãy gán nó cho một biến mới và xóa đối số đó.
Shawn Schreier

78
DF[:-n]

trong đó n là số hàng cuối cùng được thả.

Để thả hàng cuối cùng:

DF = DF[:-1]

58

Vì định vị chỉ mục trong Python dựa trên 0, nên sẽ không thực sự có một phần tử ở indexvị trí tương ứng với len(DF). Bạn cần điều đó để trở thành last_row = len(DF) - 1:

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

Tuy nhiên, nó đơn giản hơn nhiều nếu chỉ viết DF[:-1].


2
Lưu ý rằng khi giảm bằng cách sử dụng dfrm.index, chỉ mục của hàng cuối cùng phải là duy nhất, nếu không, tất cả các hàng có chỉ mục đó sẽ bị loại bỏ.
FranciscoD

Tôi có hiểu đúng không, rằng bằng cách sử dụng drop (inplace = True), bạn sửa đổi df hiện có, trong khi sử dụng df [: - 1], bạn có được một chế độ xem dữ liệu, điều này sau này có thể dẫn đến SettingWithCopyWarning?
Philipp

20

Ngạc nhiên là không ai đưa ra điều này:

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

Chạy thử nghiệm tốc độ trên DataFrame 1000 hàng cho thấy rằng việc cắt và head/ tailnhanh hơn ~ 6 lần so với việc sử dụng drop:

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Có lẽ sự khác biệt giữa hai phương pháp tiếp cận là head()tail()tạo ra một cái nhìn trong khi drop()thực sự thay đổi đại diện trong bộ nhớ (hoặc sửa đổi inplace, hoặc tạo ra một dataframe hoàn toàn mới). Tôi đã không tìm kiếm điều này trong tài liệu, ai đó làm ơn làm. (nếu đó là sự khác biệt: lời giải thích tốt cho sự khác biệt hoàn toàn và người ta cần phải lựa chọn cẩn thận giữa chúng) /
Tiến sĩ Jan-Philip Gehrcke

@ Dr.Jan-PhilipGehrcke Head head, taildroptất cả đều trả về một chế độ xem, mặc dù đúng là nó dropcung cấp cho bạn tùy chọn sửa đổi khung dữ liệu gốc tại chỗ.
theGirrafish

5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

Đầu ra của thống kê:

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

chỉ dùng skipfooter=1

bỏ qua: int, mặc định 0

Số dòng ở cuối tệp cần bỏ qua

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')

Đầu ra của thống kê_2

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723

1

drop trả về một mảng mới, đó là lý do tại sao nó bị nghẹt trong bài đăng og; Tôi đã có một yêu cầu tương tự để đổi tên một số tiêu đề cột và xóa một số hàng do tệp csv được định dạng sai được chuyển đổi thành Dataframe, vì vậy sau khi đọc bài đăng này, tôi đã sử dụng:

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

và nó hoạt động tuyệt vời, như bạn có thể thấy với hai dòng bình luận ở trên, tôi đã thử phương thức drop. () và nó hoạt động nhưng không tốt và dễ đọc như sử dụng [n: -n], hy vọng rằng sẽ giúp được ai đó, cảm ơn.


0

Đối với các DataFrame phức tạp hơn có Đa chỉ mục (giả sử "Cổ phiếu" và "Ngày") và một người muốn xóa hàng cuối cùng cho mỗi Cổ phiếu không chỉ hàng cuối cùng của Kho hàng cuối cùng, thì giải pháp là:

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

groupby()đang thêm một mức bổ sung vào Đa chỉ mục, chúng tôi chỉ giảm nó vào cuối khi sử dụng reset_index(). Df kết quả giữ cùng một loại Chỉ mục đa như trước khi hoạt động.

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.