首页 文章

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

提问于
浏览
0

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

我有这样的数据框 .

> 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

我想要

  • groupby tour_id 并取 time 列的总和,其中 condAcondBcondC 都是 False . 如下 .
tour_id    sum
      1     70
      2    100
  • 将结果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 .

3 回答

  • 0

    使用 all 过滤数据框

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

    您可以将groupby数据帧转换为dict,然后通过它映射tour_id列:

    df['driving'] = df.tour_id.map(temp.groupby('tour_id').time.sum().to_dict())
    
  • 1
    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
    

相关问题