Pandas 如何在大熊猫的条件下进行分组?

Pandas 如何在大熊猫的条件下进行分组?,pandas,dataframe,group-by,Pandas,Dataframe,Group By,我有一张像下面这样的桌子 日期 火车 条件1 条件2 第1天 1111 真的 0 第2天 2222 假的 2. 尝试通过groupby()和agg()方法: out=(df.groupby('date',as_index=False) .agg( {'train':'count','condition 1':lambda x:x,'condition 2':lambda x:x.gt(0)} ) ) out[['conditi

我有一张像下面这样的桌子

日期 火车 条件1 条件2 第1天 1111 真的 0 第2天 2222 假的 2. 尝试通过
groupby()
agg()
方法:

out=(df.groupby('date',as_index=False)
       .agg(
           {'train':'count','condition 1':lambda x:x,'condition 2':lambda x:x.gt(0)}
           )
     )
out[['condition 1','condition 2']]=out[['condition 1','condition 2']].astype(int)
最后使用
astype()
方法:

out=(df.groupby('date',as_index=False)
       .agg(
           {'train':'count','condition 1':lambda x:x,'condition 2':lambda x:x.gt(0)}
           )
     )
out[['condition 1','condition 2']]=out[['condition 1','condition 2']].astype(int)
输出的输出

    date    train   condition 1     condition 2
0   day1    1       1                   0
1   day2    1       0                   1
如果需要更改列的名称,请使用:

out.columns=['date','train total count','train with condition 1 is true','train with condition 2']
让我们试试groupby agg

df.groupby('date').agg(traintotalcount=('train', 'count'), trainwithcondition1istrue=('condition 1', lambda x: x.astype(int)), trainwithcondition2gt0=('condition 2', lambda x: int(x>0)))
结果

      traintotalcount  trainwithcondition1istrue  trainwithcondition2gt0
date                                                                    
day1                1                          1                       0
day2                1                          0                       1
可以使用.agg()方法为不同的列应用不同的聚合

试试这个:

df.groupby('date').agg({'train':'count',
                        'condition 1':'sum', 
                        'condition 2': lambda x: (x>0).sum()})
输出:

       train    condition 1   condition 2
date            
day1     1           1             0
day2     1           0             1

注意,如果
条件1
是一个布尔列,在进行求和时,python将
True
视为
1
,将
False
视为
0

为了提高性能,请在groupby之前将
True
的值与
0
类似,然后在,对于新列,使用带空格的名称
**
解包技巧:

df1 = (df.assign(new = df['condition 2'].gt(0))
         .groupby('date')
         .agg(**{'train total count': ('train', 'count'), 
                 'train with condition 1 is true': ('condition 1','sum'), 
                 'train with condition 2 > 0':('new','sum')})
         .reset_index())

print (df1)
   date  train total count  train with condition 1 is true  \
0  day1                  1                               1   
1  day2                  1                               0   

   train with condition 2 > 0  
0                           0  
1                           1  

agg(**)的含义是什么?为什么我们需要**来表示agg?事实上,我发现如果您想要的输出列名不是有效的Python关键字,那么构建一个字典并解压关键字参数。如果我们需要多个条件呢?