Более быстрый способ замены нескольких строковых значений в столбце в Pandas

#python #pandas

Вопрос:

Я пытаюсь заменить несколько строковых значений в столбце, и я понимаю, что могу использовать replace() , чтобы делать это по одному. Учитывая, что мне нужно заменить более 10 строковых значений, мне просто интересно, есть ли более быстрый способ заменить несколько строковых значений на одно и то же значение.

 df = pd.DataFrame({'a':["US", "Japan", "UK", "China", "Peru", "Germany"]})
df.replace({'a' : { 'Japan' : 'Germany', 'UK' : 'Germany', 'China' : 'Germany' }})
 

Ожидаемый результат:

          a
0       US
1  Germany
2  Germany
3  Germany
4     Peru
5  Germany
 

Комментарии:

1. Попробуйте df.replace('Japan|UK|China', 'Germany', regex=True) . df.replace() Можно использовать регулярные выражения, там вы можете комбинировать несколько строк / групп.

2. Сколько разных строковых значений у вас в столбце?

3. 15. @DaniMesejo

Ответ №1:

Используйте numpy.where с Series.isin :

 #60k rows
df = pd.DataFrame({'a':["US", "Japan", "UK", "China", "Peru", "Germany"] * 10000})

In [161]: %timeit df['a'] = df.a.map({ 'Japan' : 'Germany', 'UK' : 'Germany', 'China' : 'Germany' }).fillna(df.a)
12.4 ms ± 501 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [162]: %timeit df['a'] = np.where(df.a.isin(['Japan','UK','China']), 'Germany', df.a)
4.27 ms ± 379 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   

#assignment raise error in test
In [1632]: %timeit df.replace({'a' : { 'Japan' : 'Germany', 'UK' : 'Germany', 'China' : 'Germany' }})
7.85 ms ± 462 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
 

Более медленное решение:

 In [157]: %timeit df.replace('Japan|UK|China', 'Germany', regex=True)
218 ms ± 842 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
 

Комментарии:

1. Я думаю, что более тщательный тест должен включать переназначение, которое должно быть в виде серии, либо как прямое присвоение, либо с помощью метода assign.

2. @sammywemmy — хорошая идея.

3. У вас всегда есть несколько хороших решений!

Ответ №2:

Используйте:

 df = df.replace('Japan|UK|China', 'Germany', regex=True)
 

Комментарии:

1. добавлено к моему ответу.

2. Я понимаю вашу точку зрения. Это медленный способ сделать это. Спасибо.