基于日期范围的虚拟变量操作

时间:2017-01-31 12:25:50

标签: python pandas

我有一个输入数据集如下:

df['A_new']=df['A']

df.loc[~((df.date >='2015-07-15') & (df.date <='2015-07-22')),'A_new']=0  

这里A是事件A的虚拟/指示变量。我想进一步对虚拟变量进行子集化,如果日期在2015-07-15和2015-07-范围内,你的A_new(新指标变量)为1 22,否则它仍为0。

App\Http\Controllers

我的代码如下:

SQLite3

但我仍然没有得到理想的结果。只是想知道我的逻辑是否正确。

1 个答案:

答案 0 :(得分:2)

更简单的解决方案是将布尔掩码转换为int - 所以True1False0

df['A_new'] = ((df.date >='2015-07-15') & (df.date <='2015-07-22')).astype(int)
print (df)
        date event  A  A_new
0 2015-07-15     A  1      1
1 2015-07-16     A  1      1
2 2015-07-22     A  1      1
3 2015-07-23     A  1      0
4 2015-07-26     A  1      0

between的另一个解决方案:

df['A_new'] = df.date.between('2015-07-15','2015-07-22').astype(int)
print (df)
        date event  A  A_new
0 2015-07-15     A  1      1
1 2015-07-16     A  1      1
2 2015-07-22     A  1      1
3 2015-07-23     A  1      0
4 2015-07-26     A  1      0

正如piRSquared所指出的那样,A列需要按A列多个值(谢谢):

print (df)
         date event  A
0  2015-07-15     A  1
1  2015-07-16     A  6
2  2015-07-22     A  2
3  2015-07-23     A  1
4  2015-07-26     A  1

df['A_new'] = df.date.between('2015-07-15','2015-07-22').astype(int).mul(df.A)
print (df)
         date event  A  A_new
0  2015-07-15     A  1      1
1  2015-07-16     A  6      6
2  2015-07-22     A  2      2
3  2015-07-23     A  1      0
4  2015-07-26     A  1      0

where的解决方案:

df['A_new'] = df.A.where(df.date.between('2015-07-15','2015-07-22'), 0)
print (df)
         date event  A  A_new
0  2015-07-15     A  1      1
1  2015-07-16     A  6      6
2  2015-07-22     A  2      2
3  2015-07-23     A  1      0
4  2015-07-26     A  1      0