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
我要
groupby tour_id
并取 time
列的总和,其中 condA
和 condB
和 condC
都是 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
。
您可以将您的 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
我想知道如何在 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
我要
groupby
tour_id
并取time
列的总和,其中condA
和condB
和condC
都是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
。
您可以将您的 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