Thay thế một vài giá trị trong cột khung dữ liệu gấu trúc bằng một giá trị khác


90

Tôi có df khung dữ liệu gấu trúc như minh họa bên dưới:

BrandName Specialty
A          H
B          I
ABC        J
D          K
AB         L

Tôi muốn thay thế 'ABC' và 'AB' trong cột BrandName bằng A. Ai đó có thể giúp gì không?

Câu trả lời:


140

Cách đơn giản nhất là sử dụng replacephương thức trên cột. Các đối số là danh sách những thứ bạn muốn thay thế (ở đây ['ABC', 'AB']) và những thứ bạn muốn thay thế chúng bằng (chuỗi 'A'trong trường hợp này):

>>> df['BrandName'].replace(['ABC', 'AB'], 'A')
0    A
1    B
2    A
3    D
4    A

Thao tác này tạo một Chuỗi giá trị mới, vì vậy bạn cần gán cột mới này cho đúng tên cột:

df['BrandName'] = df['BrandName'].replace(['ABC', 'AB'], 'A')

10
Một điều khó khăn nếu các kiểu dữ liệu của bạn bị lộn xộn trong khung dữ liệu (tức là chúng trông giống như chuỗi nhưng không phải), hãy sử dụng: df ['BrandName'] = df ['BrandName']. Str.replace (['ABC', 'AB '],' A ')
ski_squaw, 15/09/17

3
Tôi cũng phải vượt qua inplace=True, nếu không nó sẽ không thay đổi.
Gonçalo Peres 龚燿禄

42

Thay thế

DataFrameđối tượng có replacephương thức mạnh mẽ và linh hoạt :

DataFrame.replace(
        to_replace=None,
        value=None,
        inplace=False,
        limit=None,
        regex=False, 
        method='pad',
        axis=None)

Lưu ý, nếu bạn cần thay đổi tại chỗ, hãy sử dụng inplaceđối số boolean cho replacephương thức:

Tại chỗ

inplace : boolean, mặc định False Nếu True, tại chỗ. Lưu ý: điều này sẽ sửa đổi bất kỳ dạng xem nào khác trên đối tượng này (ví dụ: một cột tạo thành DataFrame). Trả lại người gọi nếu đây là True.

Đoạn trích

df['BrandName'].replace(
    to_replace=['ABC', 'AB'],
    value='A',
    inplace=True
)

1
cảm ơn vì ví dụ về đoạn mã, nhưng nó không hoạt động. Đối với một, nếu không có = trong phần to_replace thì nó sẽ xảy ra lỗi. Đối với người khác, nó không thực hiện bất kỳ sự thay thế nào. Có cách nào để lấy một ví dụ làm việc về chức năng thay thế trong phiên bản 0.20.1 không?
Alison S

replacekhông quy mô tốt? Nó dường như làm hỏng máy của tôi khi thay thế ~ 5 triệu hàng số nguyên. Bất kỳ cách nào xung quanh điều này?
chàng trai

13

Hàm loc có thể được sử dụng để thay thế nhiều giá trị, Tài liệu cho nó: loc

df.loc[df['BrandName'].isin(['ABC', 'AB'])]='A'

5

Giải pháp này sẽ thay đổi chính khung dữ liệu hiện có:

mydf = pd.DataFrame({"BrandName":["A", "B", "ABC", "D", "AB"], "Speciality":["H", "I", "J", "K", "L"]})
mydf["BrandName"].replace(["ABC", "AB"], "A", inplace=True)

3

Đã tạo khung Dữ liệu:

import pandas as pd
dk=pd.DataFrame({"BrandName":['A','B','ABC','D','AB'],"Specialty":['H','I','J','K','L']})

Bây giờ sử dụng DataFrame.replace()chức năng:

dk.BrandName.replace(to_replace=['ABC','AB'],value='A')

3

Chỉ muốn cho thấy rằng không có sự khác biệt về hiệu suất giữa 2 cách chính để làm điều đó:

df = pd.DataFrame(np.random.randint(0,10,size=(100, 4)), columns=list('ABCD'))

def loc():
    df1.loc[df1["A"] == 2] = 5
%timeit loc
19.9 ns ± 0.0873 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)


def replace():
    df2['A'].replace(
        to_replace=2,
        value=5,
        inplace=True
    )
%timeit replace
19.6 ns ± 0.509 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

0

Bạn cũng có thể vượt qua một dictđến pandas.replacephương pháp:

data.replace({
    'column_name': {
        'value_to_replace': 'replace_value_with_this'
    }
})

Điều này có lợi thế là bạn có thể thay thế nhiều giá trị trong nhiều cột cùng một lúc, như sau:

data.replace({
    'column_name': {
        'value_to_replace': 'replace_value_with_this',
        'foo': 'bar',
        'spam': 'eggs'
    },
    'other_column_name': {
        'other_value_to_replace': 'other_replace_value_with_this'
    },
    ...
})
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.