繁体   English   中英

如何应用函数来创建虚拟变量?

[英]How can I apply function to create dummy variable?

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt

data={'state':[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
      'year':[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
      'pop':[11, 22, 0, 33, 44, 32, 45, 66, 34, 12, 32, 0],
      'gdp':[123, 341, 554, 654, 245, 665, 332 ,321, 344, 232, 542, 221]}
frame=pd.DataFrame(data)

def treat(group):
        if group.ix[group.year==3, 'pop']!=0:  
            group['Treated']=1
        else:
            group['Treated']=0    

frame.groupby('state').apply(treat)

我正在尝试根据某种条件创建一个可变的frame['Treated'] if ('year'==3) and ('pop'!=0) -我认为'state'在Treated组中(因此我创建了一个名为'Treated'的变量)。

不幸的是,我最终遇到一个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我的代码有什么问题? 你知道我能解决这个问题吗?

重新编辑感谢您的友好回答,对于未能明确描述我的问题,我们深感抱歉。

我试图再次描述我的问题。 对于状态1,第3年的弹出值为0,因此状态1不在处理组中(如下所示,每年状态1的frame ['Treated'] = 0)对于状态2,不弹出等于第3年的0,因此状态2在治疗组中(如下所示,每年状态2的frame ['Treated'] = 1),其他状态也因类似原因进行处理。 最终结果如下所示。

    state  year  pop  gdp  Treated
0       1     1   11  123        0
1       1     2   22  341        0
2       1     3    0  554        0
3       2     1   33  654        1
4       2     2   44  245        1
5       2     3   32  665        1
6       3     1   45  332        1
7       3     2   66  321        1
8       3     3   34  344        1
9       4     1   12  232        0
10      4     2   32  542        0
11      4     3    0  221        0

这里不需要groupby ,只需要np.where

frame['Treated']=np.where((frame.year==3)&(frame.pop!=0),1,0)
frame
Out[429]: 
    gdp  pop  state  year  Treated
0   123   11      1     1        0
1   341   22      1     2        0
2   554    0      1     3        1
3   654   33      2     1        0
4   245   44      2     2        0
5   665   32      2     3        1
6   332   45      3     1        0
7   321   66      3     2        0
8   344   34      3     3        1
9   232   12      4     1        0
10  542   32      4     2        0
11  221    0      4     3        1

np.where的替代方法是将适当的布尔掩码转换为整数类型。

frame['Treated'] = (frame.year.eq(3) & frame['pop'].ne(0)).astype(int)

您当前的代码不起作用,因为

group.ix[group.year==3, 'pop']!=0

仍然会留下熊猫系列,您不能在if语句中安全使用它。 在任何情况下,当您可以使用布尔掩码来解决问题时,使用此类apply都是不好的形式。

使用pandas.DataFrame.assignpandas.DataFrame.eval

frame.assign(Treated=frame.eval('pop != 0 & year == 3') * 1)

    gdp  pop  state  year  Treated
0   123   11      1     1        0
1   341   22      1     2        0
2   554    0      1     3        0
3   654   33      2     1        0
4   245   44      2     2        0
5   665   32      2     3        1
6   332   45      3     1        0
7   321   66      3     2        0
8   344   34      3     3        1
9   232   12      4     1        0
10  542   32      4     2        0
11  221    0      4     3        0

我乘以一个整数。 它是较短的代码,但不如@miradulo的astype(int)高效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM