Tôi có một khung dữ liệu như dưới đây.
id date name branch position
0 20323 2019-02-03 Bete H IE
1 20326 2019-02-03 Veso R MGR
2 22357 2019-02-03 Nom D IE
3 20935 2019-02-06 Dow A MGR
4 NaN NaT NaN NaN NaN
5 20432 2019-02-07 Tem W MGR
6 23999 NaT Bonny NaN NaN
7 21102 2019-02-07 Xi A IE
Tôi chỉ muốn xóa các hàng trống [ví dụ: chỉ mục 4].
Tôi đã cố gắng đọc tệp dữ liệu bằng df = pd.read_excel["../20191210/test.xlsx", skip_blank_lines=True]
.
Nhưng không có gì khác với kết quả của df = pd.read_excel["..20191210/test.xlsx"]
Dưới đây là liên kết tải xuống tệp.
Bất cứ ai có thể giúp tôi với điều này?
Hỏi ngày 11 tháng 12 năm 2019 lúc 5:05Dec 11, 2019 at 5:05
xcenxcenxcen
6422 Huy hiệu vàng6 Huy hiệu bạc19 Huy hiệu đồng2 gold badges6 silver badges19 bronze badges
3
Đây là một ví dụ với df.dropna [How = 'all']: Không có nan nếu tất cả các hàng có nan
import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
Đã trả lời ngày 11 tháng 12 năm 2019 lúc 5:21Dec 11, 2019 at 5:21
GiovanisalazargiovanisalazarGiovaniSalazar
1.8992 huy hiệu vàng7 Huy hiệu bạc12 Huy hiệu đồng2 gold badges7 silver badges12 bronze badges
5
Hãy thử df = df.dropna[]
sau khi đọc tệp Excel.
Đã trả lời ngày 11 tháng 12 năm 2019 lúc 5:18Dec 11, 2019 at 5:18
2
Bình luận
Yêu cầu tính năng của bạn có liên quan đến một vấn đề không?
Đọc Stack Overflow, đã có một số bài viết cố gắng bỏ qua các dòng trống khi đọc [Bài 1, Bài 2, Bài 3, ...]. Giải pháp đề xuất hoạt động cho gấu trúc v
In pandas 1.1.4 and 1.2: TypeError: read_excel[] got an unexpected keyword argument 'skip_blank_lines'
and no mention in the documentation posted above.
Mô tả giải pháp bạn muốn
Gấu trúc read_excel
và/hoặc ExcelFile
sẽ lấy lại đối số và chức năng này
Jankawis đã thay đổi tiêu đề Thêm trở lại Skip_Blank_Lines thành Read_Excel trong Pandas 1.1.4 Thêm Back Skip_Blank_Lines vào Read_Excel trong Pandas V> 1.1.4
Ngày 14 tháng 2 năm 2021Chúng tôi không cần phải thêm lại trong các đối số từ khóa - chỉ có thể thêm tham số này vào read_excel và tài liệu
Nếu bất cứ ai muốn thực hiện điều này, bản sửa lỗi sẽ là thêm SKIP_BLANK_LINE vào chữ ký read_excel và cuộc gọi io.parse. Xin lưu ý rằng bạn cũng sẽ cần thêm lại DocString [xem Biến _read_excel_doc
] trong Tệp ____10.
Điều này sẽ yêu cầu một bài kiểm tra mới, hoặc là đủ để TextParParser cơ bản đã có các bài kiểm tra cho SKIP_BLANK_LINES?
@ahawryluk Cảm ơn vì đã tiếp tục điều này. Tôi nghĩ rằng bạn cần thêm một thử nghiệm cụ thể cho Excel tại
import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
1 với tệp Excel mới với các dòng trống.Tôi đã tìm ra cách vượt qua
import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
2 [mặc định đúng] từ read_excel
xuống import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
4, nhưng tôi đã rất ngạc nhiên khi phát hiện ra rằng nó chỉ thay đổi kết quả được trả lại nếu bảng tính có chính xác một cột. Nếu bảng tính có nhiều cột, một hàng trống được chuyển cho TextParser là ['', '', ...] và TextParser sẽ không bỏ qua nó. Hành vi của TextParser có ý nghĩa bởi vì một dòng trống trong CSV [import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
5] rõ ràng là một điều khác so với một dòng các ô trống [import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
6].Chúng ta có nên tiến hành theo kế hoạch, khôi phục
- Tiến hành theo kế hoạch nhưng thay đổi mặc định read_excel thành
7 để loại bỏ sự ngạc nhiên của các tấm cột đơn và nhiều cột hoạt động khác nhau.import pandas as pd import numpy as np dict = {'Col1':[100, 90, np.nan, 95], 'Col2': [30, 45, np.nan, np.nan], 'Col3':[np.nan, 40,np.nan, 98]} df = pd.DataFrame[dict] # With NaN print[df] # Without NaN df = df.dropna[] print [df] # Without NaN if all rows have NaN df = df.dropna[how='all'] print [df]
- Chuyển
7 cho TextParser nhưng không để hiển thị tùy chọn từ read_excel. Trong trường hợp này, lý do sẽ là bảng tính được cấu trúc xung quanh các vị trí tế bào cụ thể và read_excel không bao giờ nên che giấu điều đó. Người dùng luôn có thể giảm_NA sau khi thực tế.import pandas as pd import numpy as np dict = {'Col1':[100, 90, np.nan, 95], 'Col2': [30, 45, np.nan, np.nan], 'Col3':[np.nan, 40,np.nan, 98]} df = pd.DataFrame[dict] # With NaN print[df] # Without NaN df = df.dropna[] print [df] # Without NaN if all rows have NaN df = df.dropna[how='all'] print [df]
- Thay đổi mặc định thành
7 nhưng thay đổi baseexcelreader để đối số cũng hoạt động cho bảng tính nhiều cột.import pandas as pd import numpy as np dict = {'Col1':[100, 90, np.nan, 95], 'Col2': [30, 45, np.nan, np.nan], 'Col3':[np.nan, 40,np.nan, 98]} df = pd.DataFrame[dict] # With NaN print[df] # Without NaN df = df.dropna[] print [df] # Without NaN if all rows have NaN df = df.dropna[how='all'] print [df]
Tôi sẽ bỏ phiếu cho 2. Nhưng tôi không thực sự chịu trách nhiệm :].
Tôi càng nghĩ về nó, tôi cũng nghiêng về tùy chọn 2. Hành vi hiện tại [read_excel thả các ô trống từ bảng tính cột đơn] có vẻ giống như một lỗi hơn là một tính năng và hầu hết các bài đăng mà @Jankawis cung cấp đang tìm kiếm một cách để tắt nó đi.
@Willayd Bạn nghĩ gì về tùy chọn này? Nó không thực sự là một sự phản đối, nhưng nó sẽ yêu cầu một điều tương lai?
Là sắc thái mà bạn đang thấy với một cột duy nhất cho Excel hoặc nó cũng được nhìn thấy trong trình phân tích cú pháp CSV?
…Đã gửi từ iphone của tôi
Vào ngày 24 tháng 2 năm 2021, lúc 11:20 sáng, Andrew Hawyrluk ***@***.***> đã viết: Tôi càng nghĩ về nó, tôi cũng nghiêng về tùy chọn 2. Hành vi hiện tại [Read_Excel giảm các ô trống Từ bảng tính một cột] có vẻ giống như một lỗi hơn là một tính năng và hầu hết các bài đăng mà @Jankawis cung cấp đang tìm cách để tắt nó. @Willayd Bạn nghĩ gì về tùy chọn này? Nó không thực sự là một sự phản đối, nhưng nó sẽ yêu cầu một điều tương lai? - Bạn đang nhận được điều này bởi vì bạn đã được đề cập. Trả lời email này trực tiếp, xem nó trên GitHub hoặc hủy đăng ký.
Nếu CSV được tạo bởi gấu trúc [hoặc bất kỳ thư viện nào khác phụ thuộc vào mô -đun thư viện tiêu chuẩn
import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]0], thì sắc thái này dành riêng cho Excel. Python
import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]0 viết một hàng trống đơn yếu tố đơn là
import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]2 vì vậy read_csv sẽ không bỏ qua nó ngay cả khi
import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]3. Ngược lại, một hàng trống đơn yếu tố từ bảng tính được chuyển cho TextParser là [] và sẽ bị bỏ qua.
Vì vậy, một cột dữ liệu đơn với các phần tử trống có thể được lưu vào CSV với index = false và tải lại nguyên vẹn. Lưu cùng một dữ liệu để vượt trội với index = false và tải lại sẽ giảm tất cả các hàng trống.
Python 3.5 có lỗi trong
import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]0 đại diện cho các hàng trống đơn yếu tố đơn là
import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
5, vì vậy dữ liệu CSV cột đơn sẽ không đi khứ hồi cho phiên bản đó. Xem #12443, #18676 và Python Bug 32255. Có lẽ có các CSV khác trong tự nhiên đại diện cho các hàng trống đơn yếu tố là import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
5 nhưng tôi cho rằng ít nhất nên nhất quán trong nội bộ.Hmm xin lỗi nhưng tôi nghĩ rằng tôi đang thiếu bức tranh lớn về cách tất cả những điều này liên quan. Vì vậy, lý tưởng vì chúng tôi có mặc định là
import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]3 trong CSV, tôi nghĩ rằng chúng ta nên phấn đấu cho cùng mặc định ở phía Excel. Nó có thể hữu ích nếu bạn đã cố gắng điều đó chỉ để thúc đẩy những gì bạn có với trường hợp thử nghiệm thất bại và chúng tôi có thể gỡ lỗi cùng nhau
Yêu cầu kéo giải quyết vấn đề này và các bài kiểm tra mới vượt qua, vì vậy nó chắc chắn là một cải tiến. Ai đó có thể đọc tài liệu mới và nghĩ, "Đó là một lựa chọn kỳ lạ", nhưng ít nhất họ có thể tắt nó ngay bây giờ.
#40214 Đã sửa lỗi hành vi lỗi của read_excel đôi khi bỏ các đường trống và đôi khi không. Tôi -1 về việc hiển thị đối số
import pandas as pd
import numpy as np
dict = {'Col1':[100, 90, np.nan, 95],
'Col2': [30, 45, np.nan, np.nan],
'Col3':[np.nan, 40,np.nan, 98]}
df = pd.DataFrame[dict]
# With NaN
print[df]
# Without NaN
df = df.dropna[]
print [df]
# Without NaN if all rows have NaN
df = df.dropna[how='all']
print [df]
2 cho người dùng. Nó sẽ cần sự triển khai của riêng nó cho Excel [chuyển qua trình phân tích cú pháp là không đủ] và import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]9 hoàn thành tương tự. Với các tệp CSV, người ta không thể phân biệt giữa một dòng thực sự trống và
df = pd.read_excel["../20191210/test.xlsx", skip_blank_lines=True]
0. Không tồn tại cho các tệp excelCó một công việc xung quanh trong 1.1 hoặc 1.2 để nhận SKIP_BLANK_LINES = chức năng sai?
Trong cả 1.1 và 1.2, tôi tin rằng các dòng trống sẽ không bị bỏ qua trừ khi một cột duy nhất được đọc. Khi một cột được đọc, hiện tại không có cách nào để không bỏ qua các dòng trống. Đó có phải là những gì bạn đang trải qua @jmathew?
Vâng, nó chỉ có một cột.
Cảm ơn @jmathew. Tôi đã không thể tìm thấy bất kỳ cách giải quyết nào cho 1.1/1.2, có vẻ như các dòng trống được gỡ bỏ trước khi bất kỳ xử lý nào khác được thực hiện bởi trình phân tích cú pháp.
Tùy chọn khả thi duy nhất tôi thấy không bỏ qua các dòng trống trong 1.1./1.2 sẽ là Backport #40214. Vì hành vi lỗi không phải là một hồi quy [mặc dù thực tế này rất phức tạp khi có khả năng giải quyết cho hành vi lỗi này bị loại bỏ trong 1.1], tôi không nghĩ rằng nên thực hiện backport trong trường hợp này. Ý kiến này cũng một phần dựa trên suy nghĩ [hy vọng?] Rằng số lượng người dùng bị ảnh hưởng là nhỏ và mức độ nghiêm trọng của tác động đối với những người dùng đó cũng nhỏ.
Nếu bạn có bất kỳ suy nghĩ về điều này - xin vui lòng chia sẻ.
Cảm ơn vì đã tìm kiếm @rhshadrach
Tôi chỉ cần một giải pháp để giúp tôi vượt qua cho đến khi 1.3 được phát hành. Vì vậy, tôi ổn với quyết định không ủng hộ.
Tắt đỉnh đầu của tôi, sửa chữa có vẻ thực sự đơn giản. Monkey có vá lỗi từ mã của tôi khi chạy thời gian chạy không? Tôi không biết làm thế nào để làm điều đó trong Python nhưng có vẻ như nó sẽ phù hợp với kịch bản này.
Nó đang chặn cho trường hợp sử dụng của tôi vì tôi cần biết vị trí ô ban đầu cho mỗi giá trị. Tuy nhiên, trường hợp xấu nhất là tôi mở lại bảng tính trong một trình đọc khác và dịch vị trí khung dữ liệu thành bản gốc cho tình huống hẹp này.
Chúng tôi đã kết thúc việc xây dựng 1.1 với #40214 được áp dụng. Điều đó dường như hoạt động tốt.
Chúng tôi cũng khám phá việc vá nó vào thời gian chạy. Hoạt động trên máy của tôi, nhưng chưa được kiểm tra đáng kể:
import pandas as pd import ast import inspect read_excel_ast = ast.parse[inspect.getsource[pd.read_excel]] # Clear the decorators because they cause errors when exec. read_excel_ast.body[0].decorator_list.clear[] # Modify the return call to include the skip_blank_lines arg return_args = read_excel_ast.body[0].body[1].value.keywords new_arg = ast.keyword['skip_blank_lines',ast.Constant[False]] new_arg.value.col_offset = 27 new_arg.value.lineno = return_args[-1].value.lineno + 1 return_args.append[new_arg] exec[compile[read_excel_ast, '', 'exec'], pd.__dict__]
Cảm ơn @jmathew - Rất vui khi biết rằng đã hoạt động. Tôi đoán bạn đã xem xét điều này, nhưng thêm một cột bổ sung [ví dụ: "Dropme"] vào các tệp Excel là một cách giải quyết tiềm năng khác, nhưng điều đó không khả thi trong nhiều tình huống.
Cảm ơn vì ping @ahawryluk - với 1.3 xung quanh tôi đồng ý rằng điều này có thể được đóng lại.