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.

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

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

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

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

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

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.

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

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

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

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

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

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

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

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