Pandas: groupby 并通过连接结果创建一个新列

Pandas: groupby and make a new column by concatenating the result

我想知道如何在 groupby 之后创建一个新列并应用求和计算。

我有一个这样的数据框。

> df
tour_id  time  condA  condB  condC
      1    10   True   True   True
      1    20   True   True   True
      1    30  False  False  False
      1    40  False  False  False
      2    15   True   True   True
      2    25  False  False  False
      2    30  False  False  False
      2    45  False  False  False
      2    50   True   True   True

我要

  1. groupby tour_id 并取 time 列的总和,其中 condAcondBcondC 都是 False.如下所示。

    tour_id    sum
          1     70
          2    100
    
  2. 将1的结果合并到原始数据框df,在一组中填充相同的值,并将这个新列命名为driving

所以结果应该是这样的:

tour_id  time  condA  condB  condC  driving
      1    10   True   True   True       70
      1    20   True   True   True       70
      1    30  False   False False       70
      1    40  False   False False       70
      2    15   True   True   True      100
      2    25  False  False  False      100
      2    30  False  False  False      100
      2    45  False  False  False      100
      2    50   True   True   True      100

我的尝试:

temp = df[(df.condA == True)&(df.condB == True) &(df.condC == True)]
df2 = temp.groupby('tour_id').time.sum().reset_index()

但是我不知道如何将df2合并到原来的df

您可以将您的 groupby 数据框转换为字典,然后通过它映射 tour_id 列:

df['driving'] = df.tour_id.map(temp.groupby('tour_id').time.sum().to_dict())

使用all过滤数据框

df['driving']=df.tour_id.map(df[(df.iloc[:,-3:]).all(1)].groupby('tour_id').time.sum())
df['driving'] = df['tour_id'].map(df[~df[['condA','condB','condC']].all(1)].groupby('tour_id')['time'].sum())

产量:

   tour_id  time  condA  condB  condC  driving
0        1    10   True   True   True       70
1        1    20   True   True   True       70
2        1    30  False  False  False       70
3        1    40  False  False  False       70
4        2    15   True   True   True      100
5        2    25  False  False  False      100
6        2    30  False  False  False      100
7        2    45  False  False  False      100
8        2    50   True   True   True      100