首页 > 解决方案 > 如何在 pandas 数据框中为每个公司的去年观察创建一个虚拟对象?

问题描述

我有一个这样的数据框:

data = {"firm": [1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4], "year" : [2000, 2001, 2002, 2003, 1990, 1991, 1992, 1993, 1994, 2010, 2011, 2012, 2005, 2006, 2007, 2008, 2009, 2010]}
df = pd.DataFrame(data)

我想为每家公司的最后一年创建一个等于 1 的虚拟变量,否则为零,如下所示:

data = {"firm": [1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4], "year" : [2000, 2001, 2002, 2003, 1990, 1991, 1992, 1993, 1994, 2010, 2011, 2012, 2005, 2006, 2007, 2008, 2009, 2010], "dummy" : [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1]}
df = pd.DataFrame(data)

我想知道最好的方法是什么。

标签: pythonpandas

解决方案


Series.duplicatedkeep='last'参数和一起使用numpy.where

df['dummy1'] = np.where(df['firm'].duplicated(keep='last'), 0, 1)

或使用转换True,False1,0bySeries.view或反转掩码Series.astype

df['dummy1'] = (~df['firm'].duplicated(keep='last')).view('i1')
#alternative
#df['dummy1'] = (~df['firm'].duplicated(keep='last')).astype('int')
print (df)
    firm  year  dummy  dummy1
0      1  2000      0       0
1      1  2001      0       0
2      1  2002      0       0
3      1  2003      1       1
4      2  1990      0       0
5      2  1991      0       0
6      2  1992      0       0
7      2  1993      0       0
8      2  1994      1       1
9      3  2010      0       0
10     3  2011      0       0
11     3  2012      1       1
12     4  2005      0       0
13     4  2006      0       0
14     4  2007      0       0
15     4  2008      0       0
16     4  2009      0       0
17     4  2010      1       1

推荐阅读