Я бы лично сделал это.
Учитывая ваш пример data.csv
...
id,q1,q2,q3
1,5,3,1
2,3,4,1
3,2,3,1
Мое решение подойдет ...
import pandas as pd
df = pd.read_csv('test_csv.csv')
print df
id q1 q2 q3
0 1 5 3 1
1 2 3 4 1
2 3 2 3 1
my_rates = [1, 2, 3, 4, 5]
df['q2'] = df['q2'].apply(lambda x:my_rates[-x])
print df
id q1 q2 q3
0 1 5 3 1
1 2 3 2 1
2 3 2 3 1
Тест
При больших наборах данных результаты резко меняются.
import pandas as pd
import timeit
df = pd.read_csv('test_csv.csv')
df = pd.concat([df] * 1000, ignore_index=True)
def imcoins(df):
my_rates = [1, 2, 3, 4, 5]
df['Q2'] = df['Q2'].apply(lambda x:my_rates[-x])
return df
def joe(df):
df['Q2'] = df['Q2'].map({1:5, 2:4, 3:3, 4:2, 5:1})
return df
def jez(df):
df.Q2 = 6 - df.Q2
return df
def jez_2(df):
df.Q2 = df.Q2.rsub(6)
return df
def jez_3(df):
df.Q2 = 6 - df.Q2.values
return df
nb = 10000
t1 = timeit.timeit(stmt='imcoins(df)', setup='from __main__ import imcoins, df', number=nb)
t2 = timeit.timeit(stmt='joe(df)', setup='from __main__ import joe, df', number=nb)
t3 = timeit.timeit(stmt='jez(df)', setup='from __main__ import jez, df', number=nb)
t4 = timeit.timeit(stmt='jez_2(df)', setup='from __main__ import jez_2, df', number=nb)
t5 = timeit.timeit(stmt='jez_3(df)', setup='from __main__ import jez_3, df', number=nb)
print 'IMCoins : {}\njoe : {}\njezrael_1 : {}\njezrael_2 : {}\tjezrael_3 : {}'.format(t1, t2, t3, t4, t5)
# Python 2.7
IMCoins : 3.85911526513
joe : 1.26151379163
jezrael_1 : 0.487986194544
jezrael_2 : 0.613230951967
jezrael_3 : 0.287318529541
# Python 3.6
IMCoins : 2.0433933256597467
joe : 1.3545644831475654
jezrael_1 : 0.482208606992109
jezrael_2 : 0.5195013265458606
jezrael_3 : 0.27176954323496627