如何使用熊猫中的条件分组?

时间:2021-06-10 04:24:15

标签: pandas dataframe group-by

我有一张像下面这样的表格

<头>
日期 训练 条件 1 条件2
第一天 1111 真实 0
第2天 2222 2

.....

我想将火车与日期分组,

<头>
日期 列车总数 条件 1 的训练为真 训练条件 2 > 0 训练条件1为真,条件2>0
第一天 1 1 0 0
第2天 1 0 1 0

我怎样才能用 Pandas 做到这一点?

4 个答案:

答案 0 :(得分:1)

尝试通过 groupby()agg() 方法:

out=(df.groupby('date',as_index=False)
       .agg(
           {'train':'count','condition 1':lambda x:x,'condition 2':lambda x:x.gt(0)}
           )
     )

最后使用astype()方法:

out[['condition 1','condition 2']]=out[['condition 1','condition 2']].astype(int)

out 的输出:

    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']

答案 1 :(得分:1)

 Print (df)

   date  train  condition 1  condition 2
0  day1   1111         True            0
1  day2   2222        False            2



df['condition 1']=df['condition 1'].astype(int)

让我们试试 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

答案 2 :(得分: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

请注意,如果 condition 1 是布尔列,python 在求和时会将 True 视为 1,将 False 视为 0

答案 3 :(得分:1)

为了提高性能,comapre greater0 之前的 groupby 到 helper 列,然后将 countsum 聚合以计算 {{3} 中的 True s 值}},对于带有空格的新列名,使用 ** 解包技巧:

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