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,pop在第3年为0,因此状态1不在处理组中(如下所示,每年状态1的帧['treated']=0)
对于状态2,pop在第3年不等于0,因此状态2在“已处理”组中(如下所示,每年状态2的“已处理”框=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

关于python - 如何应用函数来创建虚拟变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50093238/

10-12 16:58