Python pandas:根据其他变量的值获取列的值

Python pandas:根据其他变量的值获取列的值,python,pandas,Python,Pandas,我正在与一家企业合作。这是一个宽幅的面板,每年都有就业统计,比如说2005年、2006年、2007年等等。业务迁移到新地点的年份有一个变量,比如说2006年。我想为移动年的特定就业创建一个变量——也就是说,如果移动年是x,那么查找x年的就业值 理想情况下,我会将其矢量化。这就是我现在所拥有的,但我担心索引不够通用/可能不可靠,我可能会在实际数据中得到意想不到的结果 import pandas as pd import numpy as np np.random.seed(43) ## prep

我正在与一家企业合作。这是一个宽幅的面板,每年都有就业统计,比如说2005年、2006年、2007年等等。业务迁移到新地点的年份有一个变量,比如说2006年。我想为移动年的特定就业创建一个变量——也就是说,如果移动年是x,那么查找x年的就业值

理想情况下,我会将其矢量化。这就是我现在所拥有的,但我担心索引不够通用/可能不可靠,我可能会在实际数据中得到意想不到的结果

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 |
+---+------------+------------+--------+--------+--------+--------+----------+
如果我做了这样的事情,我会得到一些看起来是正确的东西,至少在这个玩具例子中是这样,但我不能肯定这是a)安全的,指数的,b)正确的蟒蛇方式(不管熊猫与这个词有什么等价物)

这似乎给出了预期的结果——例如,236确实是2009年第一行/业务的就业人数;244 2007年第二排等也一样

0    236
1    244
2    182
3    228
4     24
Name: moveyearemp, dtype: int64

如果您预先计算
moveyearemp
dataframe(按年份索引的数据集),您将能够执行
df_city.join(moveyearemp,on='year')
我可能会在几年内迭代(因为年份少于行):

这里有一个方法,但我不认为我会称之为泛滥成灾

你会得到:

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

我认为使用apply的方法在最后需要一些恼人的排序…:这绝对是可行的——并不是所有的问题都适合矢量化。感谢分享“pandastic”:)是我的循环版本,使用iterrows()kosher的元组的第一部分吗?@ako它有效/合法。。。但是,如果可能的话,遍历行通常比较慢/最好避免@ako说,遍历索引也可能很慢!
In [11]: df_city.moveyear.unique()
Out[11]: array([2009, 2007, 2006, 2008])
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