Заменить некоторые значения строкой в ​​столбце в Python

У меня есть столбец «Страна» во фрейме данных, я хотел бы сгруппировать столбец «Страна» только с двумя вариантами: «Материковый Китай» и «Другие». Я пробовал разные варианты, например, фильтр и т.д. Никто не работает. Как я должен это делать?

Вот набор данных https://drive.google.com/file/d/17DY8f-Jxba0Ky5iOUQqEZehhoWNO3vzR/view?usp=sharing

К вашему сведению, я уже сгруппировал разные провинции в Китае как одну страну "Материковый Китай"

Спасибо за вашу помощь!

введите описание изображения здесь

Всего 4 ответа


Я думаю, что самый быстрый способ изменить значение будет использовать .loc вместо apply так как .loc оптимизирован для pandas .

df.loc[df.Country != 'Mainland China', 'Country'] = 'Others'

Попробуйте (и сгруппировать по Country ):

import numpy as np

df["Country"]=np.where(df["Country"].eq("Mainland China"), "Mainland China", "Other")

редактировать

timeit (обратите внимание, что я не делал .loc[] поскольку lambda doesn't support assignment - не стесняйтесь предложить способ его добавления):

import pandas as pd
import numpy as np
import timeit
from timeit import Timer

#proportion-wise that's the dataframe, as per OP's question

df=pd.DataFrame({"Country": ["Mainland China"]*398+["a", "b","c"]*124})

df["otherCol"]=2
df["otherCol2"]=3

#shuffle

df2=df.copy().sample(frac=1)
df3=df2.copy()
df4=df3.copy()

op2=Timer(lambda: np.where(df2["Country"].eq("Mainland China"), "Mainland China", "Other"))
op3=Timer(lambda: df3.Country.map(lambda x: x if x == 'Mainland China' else 'Others'))
op4=Timer(lambda: df4["Country"].apply(lambda x: x if x == "Mainland China" else "Others"))

print(op2.timeit(number=1000))
print(op3.timeit(number=1000))
print(op4.timeit(number=1000))

Возвращает:

2.1856687490362674 #numpy
2.2388894270407036 #map
2.4437739049317315 #apply

Попробуйте использовать apply :

dataframe["Country"] = dataframe["Country"].apply(lambda x: x if x == "Mainland China" else "Others")

Предполагая, что df - ваш фрейм данных для панд.

Вы могли бы сделать:

df['Country'] = df.Country.map(lambda x: x if x == 'Mainland China' else 'Others')

Есть идеи?

10000