Python groupby多列和转换键错误

Python groupby多列和转换键错误,python,pandas,pandas-groupby,transform,Python,Pandas,Pandas Groupby,Transform,在Pandas中将转换应用于2列groupby时遇到一些问题。我已经尝试了许多引用类似用例的方法 我正在按日期和用户查找groupby,并在标志列上进行转换,如果为“nan”,则为0,否则为1。我的数据如下所示: user date Flag 0 ron 12/21/2019 1 1 ron 12/22/2019 2 2 april 12/21/2016 nan 3 april 12/23/2016

在Pandas中将转换应用于2列groupby时遇到一些问题。我已经尝试了许多引用类似用例的方法

我正在按日期和用户查找groupby,并在标志列上进行转换,如果为“nan”,则为0,否则为1。我的数据如下所示:

    user     date        Flag
0    ron  12/21/2019      1 
1    ron  12/22/2019      2  
2  april   12/21/2016    nan  
3  april  12/23/2016      1  
4   andy   12/21/2016    nan  

这是我设置的,这在逻辑上对我来说是有意义的,但我得到了一个键错误

s = master['Flag'].eq('nan').groupby(master['date','user']).transform('any')
master.loc[:,'attendance'] = s.map({True:0,False: 1}) 
在master['Flag'].eq'nan'之后,您只有序列类型。然后调用.groupby并应传递用于分组的列,但其中没有此类列

如果我正确理解了整个任务,下面是代码:

# step 1
master['Flag'] = master['Flag'] == 'nan'
master

Out[1]:

    user    date        Flag
0   ron     12/21/2019  False
1   ron     12/22/2019  False
2   april   12/21/2016  True
3   april   12/23/2016  False
4   andy    12/21/2016  True

# step 2

s = master.groupby(['date','user']).agg('any')
s

Out[2]:

                    Flag
    date    user    
12/21/2016  andy    True
            april   True
12/21/2019  ron     False
12/22/2019  ron     False
12/23/2016  april   False


# step 3

s['attendance'] = s['Flag'].map({True:0,False: 1})
s

Out[3]:

                    Flag    attendance
    date    user        
12/21/2016  andy    True    0
            april   True    0
12/21/2019  ron     False   1
12/22/2019  ron     False   1
12/23/2016  april   False   1
…或短版本
[['date','user']]而不是['date','user']]:我确实尝试过,但得到了一个不同的错误-ValueError:Grouper for not 1-dimensional非常感谢这对我有用!在短版本中,to_框架块做什么?它在最后一步中转换序列它只有一列,所以它像series一样处理dataframe。
# step 1
master['Flag'] = master['Flag'] == 'nan'
master

Out[1]:

    user    date        Flag
0   ron     12/21/2019  False
1   ron     12/22/2019  False
2   april   12/21/2016  True
3   april   12/23/2016  False
4   andy    12/21/2016  True

# step 2

s = master.groupby(['date','user']).agg('any')
s

Out[2]:

                    Flag
    date    user    
12/21/2016  andy    True
            april   True
12/21/2019  ron     False
12/22/2019  ron     False
12/23/2016  april   False


# step 3

s['attendance'] = s['Flag'].map({True:0,False: 1})
s

Out[3]:

                    Flag    attendance
    date    user        
12/21/2016  andy    True    0
            april   True    0
12/21/2019  ron     False   1
12/22/2019  ron     False   1
12/23/2016  april   False   1
master.assign(flg = master['Flag'] == 'nan').groupby(['date','user'])[['flg']].agg('any')['flg'].map({True:0,False: 1}).to_frame()