Zastąpienie kilku wartości w kolumnie dataframe pandy inną wartością

88

Mam pandas dataframe df, jak pokazano poniżej:

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

Chcę zamienić „ABC” i „AB” w kolumnie BrandName na A. Czy ktoś może w tym pomóc?

Pulkit Jha
źródło

Odpowiedzi:

138

Najłatwiej jest użyć replacemetody na kolumnie. Argumenty to lista rzeczy, które chcesz zamienić (tutaj ['ABC', 'AB']) i tym, czym chcesz je zastąpić ( 'A'w tym przypadku ciąg ):

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

Spowoduje to utworzenie nowej serii wartości, więc musisz przypisać tę nową kolumnę do właściwej nazwy kolumny:

df['BrandName'] = df['BrandName'].replace(['ABC', 'AB'], 'A')
Alex Riley
źródło
9
Jedna trudna rzecz, jeśli twoje typy danych są pomieszane w ramce danych (tj. Wyglądają jak ciągi, ale nie są), użyj: df ['BrandName'] = df ['BrandName']. Str.replace (['ABC', 'AB '],' A ')
ski_squaw
3
Ja też musiałem zdać inplace=True, bo inaczej to się nie zmieniało.
Gonçalo Peres 龚燿禄
41

Zastąpić

DataFrameobiekt ma potężną i elastyczną replacemetodę:

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

Uwaga, jeśli chcesz wprowadzić zmiany w miejscu, użyj inplaceargumentu logicznego dla replacemetody:

W miejscu

inplace : boolean, default False If True, in place. Uwaga: spowoduje to zmianę wszelkich innych widoków tego obiektu (np. Kolumny z DataFrame). Zwraca dzwoniącego, jeśli tak jest True.

Skrawek

df['BrandName'].replace(
    to_replace=['ABC', 'AB'],
    value='A',
    inplace=True
)
I159
źródło
1
dzięki za przykładowy fragment, ale to nie działa. Po pierwsze, jeśli nie ma = w części to_replace, błąd się wyświetla. Po drugie, nie dokonuje żadnych wymian. Czy istnieje działający przykład funkcji zamiany w wersji 0.20.1?
Alison S
Nie replaceskaluje się dobrze? Wygląda na to, że mój komputer powoduje awarię podczas zamiany ~ 5 milionów wierszy liczb całkowitych. Jakoś to obejść?
facet
13

Funkcja loc może być używana do zastępowania wielu wartości. Dokumentacja: loc

df.loc[df['BrandName'].isin(['ABC', 'AB'])]='A'
Saurabh
źródło
5

To rozwiązanie zmieni samą istniejącą ramkę danych:

mydf = pd.DataFrame({"BrandName":["A", "B", "ABC", "D", "AB"], "Speciality":["H", "I", "J", "K", "L"]})
mydf["BrandName"].replace(["ABC", "AB"], "A", inplace=True)
Namrata Tolani
źródło
3

Utworzono ramkę danych:

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

Teraz użyj DataFrame.replace()funkcji:

dk.BrandName.replace(to_replace=['ABC','AB'],value='A')
shubham ranjan
źródło
3

Chciałem tylko pokazać, że nie ma różnicy w wydajności między dwoma głównymi sposobami robienia tego:

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)
Claudiu Creanga
źródło
0

Możesz również przekazać dictdo pandas.replacemetody:

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

Ma to tę zaletę, że możesz zastąpić wiele wartości w wielu kolumnach jednocześnie, na przykład:

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'
    },
    ...
})
User632716
źródło