Я работаю с набором данных бизнес-учреждения. Это панель с широким диапазоном, количество занятых на каждый год, например, 2005, 2006, 2007 и т. Д. Существует переменная за год, когда бизнес переехал в новое место, скажем, 2006. Я хочу создать переменную для конкретная занятость в год перехода - то есть, если moveyear равен x, найдите значение занятости за год x.pandas: grabbing значение столбца на основе значения другой переменной
В идеале я бы векторизовал это. Это то, что у меня есть сейчас, но я беспокоюсь, что индексирование недостаточно общего/возможно, предательски, и я могу получить неожиданные результаты с реальными данными.
import pandas as pd
import numpy as np
np.random.seed(43)
## prep mock data
N = 100
industry = ['utilities','sales','real estate','finance']
city = ['sf','san mateo','oakland']
move = np.arange(2006,2010)
ind = np.random.choice(industry, N)
cty = np.random.choice(city, N)
moveyr = np.random.choice(move, N)
## place it in dataframe
jobs06 = np.random.randint(low=1,high=250,size=N)
jobs06 = np.random.randint(low=1,high=250,size=N)
jobs07 = np.random.randint(low=1,high=250,size=N)
jobs08 = np.random.randint(low=1,high=250,size=N)
jobs09 = np.random.randint(low=1,high=250,size=N)
df_city =pd.DataFrame({'industry':ind,'city':cty,'moveyear':moveyr,'jobs06':jobs06,'jobs07':jobs07,'jobs08':jobs08,'jobs09':jobs09})
df_city.head()
Что дает эти данные:
+---+------------+------------+--------+--------+--------+--------+----------+
| | city | industry | jobs06 | jobs07 | jobs08 | jobs09 | moveyear |
+---+------------+------------+--------+--------+--------+--------+----------+
| 0 | sf | utilities | 206 | 82 | 192 | 236 | 2009 |
| 1 | oakland | utilities | 10 | 244 | 2 | 7 | 2007 |
| 2 | san mateo | finance | 182 | 164 | 49 | 66 | 2006 |
| 3 | oakland | sales | 27 | 228 | 33 | 169 | 2007 |
| 4 | san mateo | sales | 24 | 24 | 127 | 165 | 2007 |
+---+------------+------------+--------+--------+--------+--------+----------+
Если я что-то вроде этого я получаю то, что кажется правильным, по крайней мере, в этом игрушечном примере, но я не уверен, что это) безопасный, индексный, б) «правильный» питонический путь (и все, что эквивалентно панде, соответствует этому термину).
df_city['moveyearemp']=0 ## seemingly must declare first
for count, row in df_city.head(5).iterrows():
get_moveyear_emp = 'jobs' + str(row['moveyear'])[2:]
## is this 'proper' indexing?
df_city.ix[count,'moveyearemp'] = df_city.ix[count,get_moveyear_emp]
print df_city['moveyearemp'].head()
Это, кажется, дают желаемых результатов - 236, например, действительно занятости на 2009 год в первом ряду/бизнеса; 244 то же за 2007 год для второй строки и так далее.
0 236
1 244
2 182
3 228
4 24
Name: moveyearemp, dtype: int64
Я думаю, что методы с применять будет нуждаться в какой-то раздражающая сортировке в конце ...: s –
Это, безусловно, работоспособное - не все проблемы поддаются одинаково хорошо векторизации , Спасибо за обмен «pandastic» :) – ako
@ako и pandorable ... –