Pandas DataFrame: thay thế tất cả các giá trị trong một cột, dựa trên điều kiện


132

Tôi có một DataFrame đơn giản như sau:

Dữ liệu gấu trúc

Tôi muốn chọn tất cả các giá trị từ cột 'Mùa đầu tiên' và thay thế các giá trị trên 1990 bằng 1. Trong ví dụ này, chỉ có Baltimore Ravens sẽ có 1996 thay thế bằng 1 (giữ nguyên các dữ liệu còn lại).

Tôi đã sử dụng như sau:

df.loc[(df['First Season'] > 1990)] = 1

Nhưng, nó thay thế tất cả các giá trị trong hàng đó bằng 1 và không chỉ các giá trị trong cột 'Mùa đầu tiên'.

Làm thế nào tôi có thể thay thế chỉ các giá trị từ cột đó?

Câu trả lời:


226

Bạn cần chọn cột đó:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

Vì vậy, cú pháp ở đây là:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Bạn có thể kiểm tra các tài liệu10 phút để gấu trúc hiển thị ngữ nghĩa

BIÊN TẬP

Nếu bạn muốn tạo ra một chỉ số boolean sau đó bạn chỉ có thể sử dụng các điều kiện boolean để tạo ra một dòng boolean và cast dtype tới intnày sẽ chuyển đổi TrueFalseđến 10lần lượt là:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003

40

Đến bữa tiệc muộn một chút nhưng tôi vẫn thích sử dụng numpy trong đó:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

2
Tôi đang tìm kiếm một giải pháp cho việc ghi đè các giá trị cột một cách có điều kiện, nhưng dựa trên giá trị của một cột khác, như sau: df ['col1'] = np.where (df ['id'] == '318431682259014', 'MỚI', df ['col1']) Đây là giải pháp cho nó.
dùng582175

Tôi đang cố gắng làm điều này cho nhiều điều kiện như thế này, nhưng tôi tiếp tục nhận được ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Những gì tôi đang cố gắng làm về cơ bản là df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Có ai có ý tưởng về điều này?
M.Schalk

5
df['First Season'].loc[(df['First Season'] > 1990)] = 1

lạ là không ai có câu trả lời này, phần còn thiếu duy nhất trong mã của bạn là ['Mùa đầu tiên'] ngay sau df và chỉ cần xóa dấu ngoặc nhọn của bạn bên trong.


Điều đó mang lại một 'Cài đặtWithCopyWarning:' Sử dụng .loc tốt hơn cho toàn bộ điều như trong câu trả lời của EdChum.
tham vọng

2

cho điều kiện duy nhất, tức là. ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

dùng cái này:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

do đó cú pháp ở đây là:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Đối với nhiều điều kiện tức là. (df['employrate'] <=55) & (df['employrate'] > 50)

dùng cái này:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

do đó cú pháp ở đây là:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Giải trình:

df.locnhận hai đối số, 'chỉ mục hàng' và 'chỉ mục cột'. Chúng tôi đang kiểm tra xem giá trị có lớn hơn 27 của mỗi giá trị hàng hay không, trong cột "Mùa đầu tiên" và sau đó chúng tôi thay thế bằng 1.

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.