如何进行自定义分组依据?
How to do a custom Group By?
我的目标是根据列 Name
的值对数据框 DF
进行分组,并将特定列聚合为总和。
当前数据帧
Name
Val1
val2
val3
0
Test
NaN
5
NaN
1
Test
30
NaN
3
2
Test
30
NaN
3
输出除外
Name
Val1
val2
val3
0
Test
60
5
3
我试过的
DF.groupby(['Name'], as_index=False)[["Val1"]].sum()
returns
Name
Val1
0
Test
60
问题
我想把 val2
和 val3
作为唯一值,然后将它们分组,但我不知道该怎么做。
也许引入一个中介DF
Name
Val1
val2
val3
0
Test
NaN
5
3
1
Test
30
5
3
2
Test
30
5
3
这样下面的代码就可以工作了:
DF.groupby(['Name','val2','val3'], as_index=False)[["Val1"]].sum()
请记住,我的数据框有多个 Name
值。
最好的方法是什么?
如果我没理解错的话,每组的 val2 和 val3 列中只有一个唯一的 non-missing 值。否则你的问题没有多大意义,因为你没有指定如何决定从这些列中获取哪个值。
考虑到这些限制,您可以使用:
result = df.groupby('Name', as_index=False).agg({'Val1': 'sum', 'val2': 'first', 'val3': 'first'})
要按一列或多列分组,同时聚合其他列,您可以使用 groupBy
followed by aggregate
(or its alias agg
)。
例子
给定输入:
Waiter Revenue Hours Tables Gender
0 Alice 3000 3.0 Outside f
1 Bob 2000 4.0 Inside m
2 Alex 1000 2.0 Inside d
3 Alex 500 0.5 Outside None
预期输出:
Revenue Hours Tables Gender
Waiter
Alex 1500 1.25 {Inside, Outside} d
Alice 3000 3.00 {Outside} f
Bob 2000 4.00 {Inside} m
按 Waiter
分组显示:
Revenue
的总和
- 工作的平均值
Hours
- 集合独特
Tables
服务
- 第一个(非未定义)值
Gender
如何 group-by 使用特定聚合
代码:
import pandas as pd
df = pd.DataFrame({'Waiter': ['Alice','Bob','Alex', 'Alex'], 'Revenue': [3000, 2000, 1000, 500], 'Hours': [3, 4, 2, 0.5], 'Tables': ['Outside', 'Inside', 'Inside', 'Outside'], 'Gender': ['f', 'm', 'd', None]})
df.groupby(['Waiter']).agg({'Revenue': 'sum', 'Hours': 'mean', 'Tables': lambda x: set(x), 'Gender': 'first'})
解释:
groupby
可以做单列的倍数,这里只做Waiter
agg
(或aggregate
)由 dict 定义每个列的聚合。该列指定为键,如 Revenue
,aggregate function 指定为函数名称 'sum'
(在引号中或作为引用,如 list
) 或像 lambda x: set(x)
这样的 lambda
注意:要获取 Tables
的列表,我们还可以将以下值定义为 聚合函数 :
'unique'
生成具有唯一值的列表(参见 Series.unique
)
set
就像我们对 lambda 所做的那样
list
列表(可能包含重复项)
另见
我的目标是根据列 Name
的值对数据框 DF
进行分组,并将特定列聚合为总和。
当前数据帧
Name | Val1 | val2 | val3 | |
---|---|---|---|---|
0 | Test | NaN | 5 | NaN |
1 | Test | 30 | NaN | 3 |
2 | Test | 30 | NaN | 3 |
输出除外
Name | Val1 | val2 | val3 | |
---|---|---|---|---|
0 | Test | 60 | 5 | 3 |
我试过的
DF.groupby(['Name'], as_index=False)[["Val1"]].sum()
returns
Name | Val1 | |
---|---|---|
0 | Test | 60 |
问题
我想把 val2
和 val3
作为唯一值,然后将它们分组,但我不知道该怎么做。
也许引入一个中介DF
Name | Val1 | val2 | val3 | |
---|---|---|---|---|
0 | Test | NaN | 5 | 3 |
1 | Test | 30 | 5 | 3 |
2 | Test | 30 | 5 | 3 |
这样下面的代码就可以工作了:
DF.groupby(['Name','val2','val3'], as_index=False)[["Val1"]].sum()
请记住,我的数据框有多个 Name
值。
最好的方法是什么?
如果我没理解错的话,每组的 val2 和 val3 列中只有一个唯一的 non-missing 值。否则你的问题没有多大意义,因为你没有指定如何决定从这些列中获取哪个值。
考虑到这些限制,您可以使用:
result = df.groupby('Name', as_index=False).agg({'Val1': 'sum', 'val2': 'first', 'val3': 'first'})
要按一列或多列分组,同时聚合其他列,您可以使用 groupBy
followed by aggregate
(or its alias agg
)。
例子
给定输入:
Waiter Revenue Hours Tables Gender
0 Alice 3000 3.0 Outside f
1 Bob 2000 4.0 Inside m
2 Alex 1000 2.0 Inside d
3 Alex 500 0.5 Outside None
预期输出:
Revenue Hours Tables Gender
Waiter
Alex 1500 1.25 {Inside, Outside} d
Alice 3000 3.00 {Outside} f
Bob 2000 4.00 {Inside} m
按 Waiter
分组显示:
Revenue
的总和
- 工作的平均值
Hours
- 集合独特
Tables
服务 - 第一个(非未定义)值
Gender
如何 group-by 使用特定聚合
代码:
import pandas as pd
df = pd.DataFrame({'Waiter': ['Alice','Bob','Alex', 'Alex'], 'Revenue': [3000, 2000, 1000, 500], 'Hours': [3, 4, 2, 0.5], 'Tables': ['Outside', 'Inside', 'Inside', 'Outside'], 'Gender': ['f', 'm', 'd', None]})
df.groupby(['Waiter']).agg({'Revenue': 'sum', 'Hours': 'mean', 'Tables': lambda x: set(x), 'Gender': 'first'})
解释:
groupby
可以做单列的倍数,这里只做Waiter
agg
(或aggregate
)由 dict 定义每个列的聚合。该列指定为键,如Revenue
,aggregate function 指定为函数名称'sum'
(在引号中或作为引用,如list
) 或像lambda x: set(x)
这样的 lambda
注意:要获取 Tables
的列表,我们还可以将以下值定义为 聚合函数 :
'unique'
生成具有唯一值的列表(参见Series.unique
)set
就像我们对 lambda 所做的那样list
列表(可能包含重复项)