Python 由公司根据环境中的条件创建虚拟对象
我有一个熊猫数据框,看起来像这样:Python 由公司根据环境中的条件创建虚拟对象,python,pandas,Python,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], "var" : [3,
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], "var" : [3, 2, 1, 0.5, 5, 3, 2, 0.5, 0.5, 0.5, 0, 0, 8, 5, 3, 0.5, 0.5, 0.5]}
df = pd.DataFrame(data)
df
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], "var" : [3, 2, 1, 0.5, 5, 3, 2, 0.5, 0.5, 0.5, 0, 0, 8, 5, 3, 0.5, 0.5, 0.5], "dummy" : [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1]}
df = pd.DataFrame(data)
df
我想为每个公司创建一个虚拟变量,条件如下:
当变量“var”连续两年等于或小于0.5时,“dummy”等于1,因此变量“dummy”如下所示:
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], "var" : [3, 2, 1, 0.5, 5, 3, 2, 0.5, 0.5, 0.5, 0, 0, 8, 5, 3, 0.5, 0.5, 0.5]}
df = pd.DataFrame(data)
df
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], "var" : [3, 2, 1, 0.5, 5, 3, 2, 0.5, 0.5, 0.5, 0, 0, 8, 5, 3, 0.5, 0.5, 0.5], "dummy" : [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1]}
df = pd.DataFrame(data)
df
做这件事最好的方法是什么?让我们试试使用shift的groupby
让我们用shift试试groupby
你的要求几乎可以翻译成中文。 首先按公司分组,然后检查您的条件是否符合申请条件。 你可以通过轮班获得下一年
你的要求几乎可以翻译成中文。 首先按公司分组,然后检查您的条件是否符合申请条件。 你可以通过轮班获得下一年
您可以移动、检查阈值并与原始系列上的检查相结合:
df.groupby('firm')['var'].shift().le(.5) & df['var'].le(.5)
这应该比groupby.apply稍微快一点
另一种方法是滚动,在需要检查几年的情况下效果更好:
输出:
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 True
9 False
10 True
11 True
12 False
13 False
14 False
15 False
16 True
17 True
Name: var, dtype: bool
您可以移动、检查阈值并与原始系列上的检查相结合:
df.groupby('firm')['var'].shift().le(.5) & df['var'].le(.5)
这应该比groupby.apply稍微快一点
另一种方法是滚动,在需要检查几年的情况下效果更好:
输出:
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 True
9 False
10 True
11 True
12 False
13 False
14 False
15 False
16 True
17 True
Name: var, dtype: bool