Использовать Series.map
со словарем, созданным из списков:
Europa = ["Austria", "Belgium", "Denmark",'France','Finland']
RamasOccidentales = ["Australia","New Zealand","Canada","United States"]
Latinoamerica = ["Brazil","Chile","Uruguay"]
Asia = ["Indonesia","Japan","Sri Lanka"]
d = {'Europa':Europa,'RamasOccidentales':RamasOccidentales,
'Latinoamerica':Latinoamerica,'Asia':Asia}
#swap key values in dict
#http://stackoverflow.com/a/31674731/2901002
d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
df['Region'] = df['Country'].map(d1)
print (df)
Year Country Population GDP Region
0 1870 Austria 4,520 8,419 Europa
1 1870 Belgium 5,096 13,716 Europa
2 1870 Denmark 1,888 3,782 Europa
3 1870 Finland 1,754 1,999 Europa
4 1870 France 38,440 72,100 Europa
print (d1)
{'Austria': 'Europa', 'Belgium': 'Europa', 'Denmark': 'Europa',
'France': 'Europa', 'Finland': 'Europa',
'Australia': 'RamasOccidentales',
'New Zealand': 'RamasOccidentales',
'Canada': 'RamasOccidentales',
'United States': 'RamasOccidentales',
'Brazil': 'Latinoamerica', 'Chile': 'Latinoamerica',
'Uruguay': 'Latinoamerica', 'Indonesia': 'Asia',
'Japan': 'Asia', 'Sri Lanka': 'Asia'}
Производительность для строк по 10 КБ в 2,58 раза лучше:
np.random.seed(2019)
Europa = ["Austria", "Belgium", "Denmark",'France','Finland']
RamasOccidentales = ["Australia","New Zealand","Canada","United States"]
Latinoamerica = ["Brazil","Chile","Uruguay"]
Asia = ["Indonesia","Japan","Sri Lanka"]
d = {'Europa':Europa,'RamasOccidentales':RamasOccidentales,
'Latinoamerica':Latinoamerica,'Asia':Asia}
d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
df = pd.DataFrame({'Country': np.random.choice(list(d1.keys()), size=10000)})
In [280]: %%timeit
...: d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
...:
...: df['Region'] = df['Country'].map(d1)
...:
3.04 ms ± 43.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [281]: %%timeit
...: classification_countries={'Europa':Europa,
...: 'RamasOccidentales':RamasOccidentales,
...: 'Latinoamerica':Latinoamerica ,
...: 'Asia':Asia}
...:
...: cond=[df['Country'].isin(classification_countries[key]) for key in classification_countries]
...: values=[ key for key in classification_countries]
...:
...: df['Region']=np.select(cond,values)
...:
7.86 ms ± 56.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [282]: %%timeit
...: cond=[df['Country'].isin(Europa),df['Country'].isin(RamasOccidentales),df['Country'].isin(Latinoamerica),df['Country'].isin(Asia)]
...: values=['Europa','RamasOccidentales','Latinoamerica','Asia']
...: df['Region']=np.select(cond,values)
...:
7.96 ms ± 281 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [293]: %%timeit
...: classification_countries={'Europa':Europa,
...: 'RamasOccidentales':RamasOccidentales,
...: 'Latinoamerica':Latinoamerica ,
...: 'Asia':Asia}
...:
...: dict_cond_values= {key:df['Country'].isin(classification_countries[key]) for key in classification_countries}
...:
...:
...: df['Region']=np.select(dict_cond_values.values(),dict_cond_values.keys())
...:
8.54 ms ± 1.31 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)