如何进行自定义分组依据?

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

问题

我想把 val2val3 作为唯一值,然后将它们分组,但我不知道该怎么做。

也许引入一个中介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'})

解释:

  1. groupby可以做单列的倍数,这里只做Waiter
  2. agg(或aggregate)由 dict 定义每个列的聚合。该列指定为键,如 Revenueaggregate function 指定为函数名称 'sum'(在引号中或作为引用,如 list) 或像 lambda x: set(x)
  3. 这样的 lambda

注意:要获取 Tables 的列表,我们还可以将以下值定义为 聚合函数 :

  • 'unique' 生成具有唯一值的列表(参见 Series.unique
  • set 就像我们对 lambda 所做的那样
  • list 列表(可能包含重复项)

另见