#python #pandas #pandas-apply
#python #pandas #pandas-применить
Вопрос:
У меня есть столбец в моем фрейме данных pandas под названием «Состояние». Он содержит сокращения штатов США.У меня есть жестко закодированные регионы, и я хочу создать новый столбец с регионом для каждого состояния.
Я использовал pd.Series.apply(), но мне интересно, есть ли лучшая практика для такого типа сопоставления. Есть предложения о том, как я мог бы улучшить свой код?
Это мой текущий код, который работает, но я просто открыт для предложений по лучшим практикам.
def get_region(s, *regions):
if s in regions[0]:
return 'west'
elif s in regions[1]:
return 'midwest'
elif s in regions[2]:
return 'south'
elif s in regions[3]:
return 'northeast'
else:
return None
west = ['WA','OR','CA','ID','NV','MT','WY','UT','AZ','CO','NM']
midwest = ['ND','MN','WI','MI','SD','NE','KS','IA','MO','IL','IN','OH']
south = ['TX','OK','AR','LA','MS','TN','KY','AL','GA','FL','SC','NC','VA','WV','MD','DE']
northeast = ['PA','NJ','NY','CT','MA','RI','VT','NH','ME']
regions = [west,midwest,south,northeast]
full_df['Region'] = full_df['State'].apply(get_region, args=regions)
full_df['Region'].head(15)
Out:
0 west
1 midwest
2 south
3 south
4 midwest
5 west
6 south
7 south
8 west
9 midwest
10 south
11 northeast
12 northeast
13 west
14 west
Name: Region, dtype: object
Комментарии:
1. Вы ищете эффективность, так как в нем должно выполняться быстрее? Или использовать меньше кода?
2. Запускайте быстрее и / или меньше кода. На самом деле я просто ищу наилучшую практику кодирования, которая, как я полагаю, будет сочетать более быструю работу с меньшим количеством кода.
3. «меньше кода»! -> «лучшая практика»
Ответ №1:
Проверьте с map
s=pd.DataFrame([west,midwest,south,northeast],index=['west','midwest','south','northeast'])
s=s.reset_index().melt('index')
full_df['Region'] = full_df['State'].map(dict(zip(s['value'],s['index'])))
Комментарии:
1. Спасибо! отлично работает, и теперь я знаю, что делает .melt()!
Ответ №2:
Вы могли бы попробовать создать dict и сопоставить его со столбцом:
west_dict = {i:"west" for i in west}
midwest_dict = {i:"midwest" for i in midwest}
south_dict = {i:"south" for i in south}
northeast_dict = {i:"northeast" for i in northeast}
d = {**west_dict, **midwest_dict, **south_dict, **northeast_dict}
full_df['Region'] = full_df['State'].map(d)
Комментарии:
1. Я создал d в одной строке, используя именно то, что вы сделали, и просто сопоставил с d , но ваш ответ был намного более читаемым, как вы его представили. Спасибо!
2. Отлично! Да, я стремился к ясности, но в целом его определенно можно сократить до меньшего количества строк.