根据熊猫的情况,由公司制作一个假人



我有一个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, 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

我想为每个公司创建一个伪变量,条件如下:

每当变量"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], "dummy" : [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1]} 
df = pd.DataFrame(data) 
df

最好的方法是什么?

您只需移动、检查阈值并与原始系列的检查结合即可:

df.groupby('firm')['var'].shift().le(.5) & df['var'].le(.5)

这应该比groupby().apply稍快。

另一种方法是rolling:,在需要检查几年的情况下效果更好

df['dummy'] = df.groupby('firm')['var'].transform(lambda x: x.rolling(2).max().le(.5))

输出:

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

让我们尝试使用shiftgroupby

df.groupby('firm')['var'].apply(lambda x : x.shift().le(0.5) & x.le(0.5))
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

您的需求几乎可以翻译成熊猫
第一家groupby公司,然后检查您的条件是否符合apply
您可以使用shift获得下一年

import pandas as pd
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)
# Solution
df['dummy'] = df.groupby('firm')['var'].apply(lambda x: (x.shift() <= .5) & (x <= .5)).view('i1')
print(df)

输出:

firm  year  var  dummy
0      1  2000  3.0      0
1      1  2001  2.0      0
2      1  2002  1.0      0
3      1  2003  0.5      0
4      2  1990  5.0      0
5      2  1991  3.0      0
6      2  1992  2.0      0
7      2  1993  0.5      0
8      2  1994  0.5      1
9      3  2010  0.5      0
10     3  2011  0.0      1
11     3  2012  0.0      1
12     4  2005  8.0      0
13     4  2006  5.0      0
14     4  2007  3.0      0
15     4  2008  0.5      0
16     4  2009  0.5      1
17     4  2010  0.5      1

最新更新