我有一个类似以下的数据框
+----------------+-------+ | 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 | +-----+----+----+----+
做到这一点最简单的方法是什么?
要实现这个目标,你可以使用 pandas 来处理数据框。具体来说,你可以按照以下步骤操作:
pandas
class
下面是实现代码:
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
df.explode('class')
该方法将 class 列中的列表拆分成多个行。例如,['A', 'B'] 会变成两行:('A', 2001) 和 ('B', 2001)。
['A', 'B']
('A', 2001)
('B', 2001)
groupby(['year', 'class']).size():
groupby(['year', 'class']).size()
使用 groupby 对 year 和 class 进行分组,并计算每组的大小(即每个类别在每年中出现的次数)。
groupby
year
unstack(fill_value=0):
unstack(fill_value=0)
unstack
fill_value=0
这样,你就得到了每年每个类别的计数,格式正如你所期望的结果。