Hướng dẫn python replace empty string - python thay thế chuỗi trống

Tôi muốn tìm tất cả các giá trị trong khung dữ liệu gấu trúc có chứa khoảng trắng (bất kỳ số lượng tùy ý nào) và thay thế các giá trị đó bằng nans.

Bất kỳ ý tưởng làm thế nào điều này có thể được cải thiện?

Về cơ bản tôi muốn chuyển cái này:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz 2000-01-05 -0.222552 4 2000-01-06 -1.176781 qux

Vào điều này:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN

Tôi đã quản lý để làm điều đó với mã bên dưới, nhưng con người là xấu xí. Nó không phải là Pythonic và tôi chắc chắn rằng nó cũng không phải là cách sử dụng gấu trúc hiệu quả nhất. Tôi lặp qua mỗi cột và thay thế boolean so với mặt nạ cột được tạo bằng cách áp dụng một hàm thực hiện tìm kiếm regex của mỗi giá trị, khớp với khoảng trắng.

for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None

Nó có thể được tối ưu hóa một chút bằng cách chỉ lặp qua các trường có thể chứa các chuỗi trống:

if df[i].dtype == np.dtype('object')

Nhưng đó không phải là một cải tiến nhiều

Và cuối cùng, mã này đặt các chuỗi mục tiêu thành không ai, hoạt động với các chức năng của Pandas như for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 6, nhưng sẽ rất tốt cho sự hoàn chỉnh nếu tôi thực sự có thể chèn trực tiếp for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 7 thay vì for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 8.

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges286 bronze badges

Đã hỏi ngày 18 tháng 11 năm 2012 lúc 22:22Nov 18, 2012 at 22:22

Chris Clarkchris ClarkChris Clark

4.3942 Huy hiệu vàng21 Huy hiệu bạc22 Huy hiệu đồng2 gold badges21 silver badges22 bronze badges

3

Tôi nghĩ for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 9 thực hiện công việc, vì Pandas 0,13:

df = pd.DataFrame([ [-0.532681, 'foo', 0], [1.490752, 'bar', 1], [-1.387326, 'foo', 2], [0.814772, 'baz', ' '], [-0.222552, ' ', 4], [-1.176781, 'qux', ' '], ], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06')) # replace field that's entirely space (or empty) with NaN print(df.replace(r'^\s*$', np.nan, regex=True))

Produces:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN

Như Temak đã chỉ ra, hãy sử dụng if df[i].dtype == np.dtype('object') 0 trong trường hợp dữ liệu hợp lệ của bạn chứa không gian trắng.

SMCI

30.8K18 Huy hiệu vàng111 Huy hiệu bạc146 Huy hiệu đồng18 gold badges111 silver badges146 bronze badges

Đã trả lời ngày 21 tháng 2 năm 2014 lúc 18:48Feb 21, 2014 at 18:48

Patricksurrypatricksurrypatricksurry

5.2902 Huy hiệu vàng26 Huy hiệu bạc36 Huy hiệu đồng2 gold badges26 silver badges36 bronze badges

10

Nếu bạn muốn thay thế một chuỗi trống và bản ghi chỉ bằng khoảng trống, câu trả lời đúng là!:correct answer is!:

df = df.replace(r'^\s*$', np.nan, regex=True)

Câu trả lời được chấp nhận

df.replace(r'\s+', np.nan, regex=True)

Không thay thế một chuỗi trống !, Bạn có thể tự thử với ví dụ đã cho được cập nhật một chút:

df = pd.DataFrame([ [-0.532681, 'foo', 0], [1.490752, 'bar', 1], [-1.387326, 'fo o', 2], [0.814772, 'baz', ' '], [-0.222552, ' ', 4], [-1.176781, 'qux', ''], ], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))

Cũng lưu ý rằng 'fo o' không được thay thế bằng nan, mặc dù nó chứa một không gian. Lưu ý thêm, rằng một đơn giản:

df.replace(r'', np.NaN)

Cũng không hoạt động - hãy thử nó.

Đã trả lời ngày 14 tháng 12 năm 2017 lúc 10:20Dec 14, 2017 at 10:20

Philipp Schwarzphilipp SchwarzPhilipp Schwarz

Huy hiệu vàng 16K531 Huy hiệu bạc35 Huy hiệu đồng5 gold badges31 silver badges35 bronze badges

Bạn nghĩ thế nào về:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 0

Hàm if df[i].dtype == np.dtype('object') 1 áp dụng một hàm cho mọi ô của DataFrame.

Đã trả lời ngày 18 tháng 11 năm 2012 lúc 23:15Nov 18, 2012 at 23:15

BrenbarnbrenbarnBrenBarn

Phù thủy vàng 234K3535 gold badges397 silver badges375 bronze badges

5

Tôi đã làm điều này:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 1

hoặc

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 2

Bạn có thể tước tất cả STR, sau đó thay thế STR trống bằng if df[i].dtype == np.dtype('object') 2.

Petezurich

8.4758 Huy hiệu vàng38 Huy hiệu bạc55 Huy hiệu Đồng8 gold badges38 silver badges55 bronze badges

Đã trả lời ngày 29 tháng 4 năm 2016 lúc 9:34Apr 29, 2016 at 9:34

2

Nếu bạn đang xuất dữ liệu từ tệp CSV thì có thể đơn giản như thế này:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 3

Điều này sẽ tạo ra khung dữ liệu cũng như thay thế các giá trị trống dưới dạng na

Ayhan

66.9K18 Huy hiệu vàng173 Huy hiệu bạc192 Huy hiệu Đồng18 gold badges173 silver badges192 bronze badges

Đã trả lời ngày 7 tháng 1 năm 2018 lúc 16:07Jan 7, 2018 at 16:07

1

Đơn giản nhất trong tất cả các giải pháp:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 4

Đã trả lời ngày 22 tháng 3 năm 2018 lúc 14:44Mar 22, 2018 at 14:44

Gil Baggiogil BaggioGil Baggio

11.8k3 Huy hiệu vàng47 Huy hiệu bạc34 Huy hiệu đồng3 gold badges47 silver badges34 bronze badges

Đối với một giải pháp rất nhanh và đơn giản trong đó bạn kiểm tra sự bình đẳng so với một giá trị duy nhất, bạn có thể sử dụng phương thức if df[i].dtype == np.dtype('object') 3.

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 5

Đã trả lời ngày 3 tháng 11 năm 2017 lúc 22:48Nov 3, 2017 at 22:48

Ted Petrout PetrouTed Petrou

55.4K19 Huy hiệu vàng122 Huy hiệu bạc129 Huy hiệu đồng19 gold badges122 silver badges129 bronze badges

0

Điều này làm việc cho tôi. Khi tôi nhập tệp CSV của mình, tôi đã thêm na_values ​​= ''. Không gian không được bao gồm trong các giá trị NAN mặc định.

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 6

Joe Ferndz

8.2972 Huy hiệu vàng12 Huy hiệu bạc32 Huy hiệu Đồng2 gold badges12 silver badges32 bronze badges

Đã trả lời ngày 8 tháng 5 năm 2020 lúc 0:49May 8, 2020 at 0:49

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 7

Đã trả lời ngày 29 tháng 9 năm 2018 lúc 20:31Sep 29, 2018 at 20:31

JayanthajayanthaJayantha

2.1011 Huy hiệu vàng10 Huy hiệu bạc12 Huy hiệu đồng1 gold badge10 silver badges12 bronze badges

Tất cả đều gần với câu trả lời đúng, nhưng tôi sẽ không nói bất kỳ giải quyết vấn đề nào trong khi vẫn dễ đọc nhất cho những người khác đọc mã của bạn. Tôi muốn nói rằng câu trả lời là sự kết hợp giữa câu trả lời của Brenbarn và nhận xét của Tuomasttik bên dưới câu trả lời đó. Câu trả lời của Brenbarn sử dụng if df[i].dtype == np.dtype('object') 4 tích hợp, nhưng không hỗ trợ loại bỏ các chuỗi trống, như OP yêu cầu và tôi sẽ có xu hướng gán cho trường hợp sử dụng tiêu chuẩn là thay thế các chuỗi bằng null.

Tôi viết lại nó với if df[i].dtype == np.dtype('object') 5, vì vậy bạn có thể gọi nó vào if df[i].dtype == np.dtype('object') 6 hoặc if df[i].dtype == np.dtype('object') 7.

Python 3:

Để thay thế các chuỗi trống hoặc chuỗi các không gian hoàn toàn:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 8

Để thay thế chuỗi không gian hoàn toàn:

A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN 9

Để sử dụng điều này trong Python 2, bạn sẽ cần thay thế if df[i].dtype == np.dtype('object') 8 bằng if df[i].dtype == np.dtype('object') 9.

Python 2:

Để thay thế các chuỗi trống hoặc chuỗi các không gian hoàn toàn:

for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 0

Để thay thế chuỗi không gian hoàn toàn:

for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 1

Để sử dụng điều này trong Python 2, bạn sẽ cần thay thế if df[i].dtype == np.dtype('object') 8 bằng if df[i].dtype == np.dtype('object') 9.May 12, 2019 at 4:05

spen.smithspen.smithspen.smith

Python 2:2 silver badges14 bronze badges

Đã trả lời ngày 12 tháng 5 năm 2019 lúc 4:05

for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 2

5482 Huy hiệu bạc14 Huy hiệu ĐồngJan 14, 2019 at 5:02

Đây không phải là một giải pháp thanh lịch, nhưng những gì dường như hoạt động là tiết kiệm cho XLSX và sau đó nhập lại. Các giải pháp khác trên trang này không hiệu quả với tôi, không chắc tại sao.David Kong

Đã trả lời ngày 14 tháng 1 năm 2019 lúc 5:025 silver badges18 bronze badges

David Kongdavid Kong

for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 3

hoặc

for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 4

Bạn có thể tước tất cả STR, sau đó thay thế STR trống bằng if df[i].dtype == np.dtype('object') 2.Oct 8, 2020 at 10:54

1

Petezurich

for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None 5

Đã trả lời ngày 1 tháng 2 năm 2018 lúc 10:14Feb 1, 2018 at 10:14

EricericERIC

1151 Huy hiệu vàng2 Huy hiệu bạc9 Huy hiệu đồng1 gold badge2 silver badges9 bronze badges

1

Chủ đề