首页 > 解决方案 > 熊猫:按列表分组

问题描述

我发现了一个按列表对 pandas 进行分组的示例

import pandas as pd
import numpy as np

rng = np.random.RandomState(0)
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
'data1': range(6),
'data2': rng.randint(0, 10, 6)},
columns = ['key', 'data1', 'data2'])
L = [0, 1, 0, 1, 2, 0]
print(df); print(df.groupby(L).sum())

输出是:

  key  data1  data2
0   A      0      5
1   B      1      0
2   C      2      3
3   A      3      3
4   B      4      7
5   C      5      9
   data1  data2
0      7     17
1      4      3
2      4      7

我不明白如何按列表进行分组。为什么我得到这样的结果?

标签: pythonpandas

解决方案


groupby 所做的是在聚合之前获取df该对中的行以及 中的每个值L

配对:

0,1第 0、2、5 行配对,与第 1 行和第 3 行配对,而 2 与第 4 行配对。您可以从 groupby 中看到:

[*df.groupby(L)]
Out[111]: 
[(0,
    key  data1  data2
  0   A      0      5
  2   C      2      3
  5   C      5      9),
 (1,
    key  data1  data2
  1   B      1      0
  3   A      3      3),
 (2,
    key  data1  data2
  4   B      4      7)]

一旦确定配对,聚合就可以进行。请注意,因为它是sum,所以只保留数字列。在未来的 pandas 版本中,您可能必须明确声明要聚合的列。

另请注意,L 的长度必须与行数匹配,df否则 groupby 将失败。


推荐阅读