2013-12-18 4 views
1

Я работаю с набором данных бизнес-учреждения. Это панель с широким диапазоном, количество занятых на каждый год, например, 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 

ответ

2

я бы, вероятно, перебирать на протяжении многих лет (так как там меньше лет, чем строк):

In [11]: df_city.moveyear.unique() 
Out[11]: array([2009, 2007, 2006, 2008]) 

Вот один из способов сделать это, но я не думаю, что я бы назвал это pandastic ...

g = df_city.groupby('moveyear') 
df_city['moveyearemp'] = 0 
for year, ind in g.indices.iteritems(): 
    year_abbr = str(year)[2:] 
    df_city.loc[ind, 'moveyearemp'] = df_city.loc[ind, 'jobs%s' % year_abbr] 

И вы получите:

In [21]: df_city.head() 
Out[21]: 
     city industry jobs06 jobs07 jobs08 jobs09 moveyear moveyearemp 
0   sf utilities  206  82  192  236  2009   236 
1 oakland utilities  10  244  2  7  2007   244 
2 san mateo finance  182  164  49  66  2006   182 
3 oakland  sales  27  228  33  169  2007   228 
4 san mateo  sales  24  24  127  165  2007   24 
+1

Я думаю, что методы с применять будет нуждаться в какой-то раздражающая сортировке в конце ...: s –

+1

Это, безусловно, работоспособное - не все проблемы поддаются одинаково хорошо векторизации , Спасибо за обмен «pandastic» :) – ako

+0

@ako и pandorable ... –

0

Если вы заранее рассчитать moveyearemp dataframe (набора данных индексируется года) вы будете в состоянии сделать df_city.join(moveyearemp, on='year')

Смежные вопросы