小能豆

Pandas 对一列中的多个值进行分组

py

我有一个类似以下的数据框

+----------------+-------+
| class          | year  |
+----------------+-------+
| ['A', 'B']     | 2001  |
| ['A']          | 2002  |
| ['B']          | 2001  |
| ['A', 'B', 'C']| 2003  |
| ['B', 'C']     | 2001  |
| ['C']          | 2003  |
+----------------+-------+

我想使用它创建一个数据框,以便结果表显示每年班级中每个类别的数量。

+-----+----+----+----+
|year | A  | B  | C  |
+-----+----+----+----+
|2001 | 1  | 3  | 1  |
|2002 | 1  | 0  | 0  |
|2003 | 1  | 1  | 2  |
+-----+----+----+----+

做到这一点最简单的方法是什么?


阅读 20

收藏
2024-11-15

共1个答案

小能豆

要实现这个目标,你可以使用 pandas 来处理数据框。具体来说,你可以按照以下步骤操作:

  1. class 列进行展开,将每个元素(如 ‘A’, ‘B’, ‘C’)按行拆分,得到每个类别和对应的年份。
  2. 对每个类别和年份组合进行计数,得到每个类别在每年出现的次数。

下面是实现代码:

import pandas as pd

# 创建原始数据框
data = {
    'class': [['A', 'B'], ['A'], ['B'], ['A', 'B', 'C'], ['B', 'C'], ['C']],
    'year': [2001, 2002, 2001, 2003, 2001, 2003]
}

df = pd.DataFrame(data)

# 使用 explode 方法将类列表拆分成多个行
df_exploded = df.explode('class')

# 使用 groupby 和 pivot_table 对结果进行分组,并计算每年每个类别的出现次数
result = df_exploded.groupby(['year', 'class']).size().unstack(fill_value=0)

# 显示结果
print(result)

结果:

class   A  B  C
year           
2001    1  3  1
2002    1  0  0
2003    1  1  2

代码解析:

  1. df.explode('class'):
  2. 该方法将 class 列中的列表拆分成多个行。例如,['A', 'B'] 会变成两行:('A', 2001)('B', 2001)

  3. groupby(['year', 'class']).size():

  4. 使用 groupbyyearclass 进行分组,并计算每组的大小(即每个类别在每年中出现的次数)。

  5. unstack(fill_value=0):

  6. 使用 unstack 将类别(class)转为列,生成一个透视表。fill_value=0 表示如果某个类别在某个年份没有出现,则填充为 0。

这样,你就得到了每年每个类别的计数,格式正如你所期望的结果。

2024-11-15