Python – 如何在Pandas中将DataFrame行分组为列表?
在Pandas中,DataFrame是一个非常常用的数据结构。从某种意义上来说,可以将DataFrame看作是Excel表格的Python版本。对于数据分析和处理来说,在Pandas中对DataFrame进行行或列分组是一项非常常见的任务。但是,在某些情况下,我们需要将某些行按照某种条件分组成列表。在这篇文章中,我们将介绍如何在Pandas中将DataFrame行分组为列表。
更多Pandas相关文章,请阅读:Pandas 教程
Pandas的基础知识
在开始介绍行分组之前,我们先来了解一下Pandas的一些基础知识。在Pandas中,DataFrame是一个带有标签列的二维表格数据结构。每列可以有不同的数据类型(例如,整数、浮点数、字符串等)。Pandas中还有另一个重要的数据结构叫做Series,它是一维带标签数组结构。每个Series都有一个index,它可以用来标识Series中的每个元素。同时,Series也可以有不同的数据类型。
下面是一个示例代码,它用来创建一个DataFrame:
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [25, 23, 29, 32, 21],
'gender': ['F', 'M', 'M', 'M', 'F'],
'score1': [92, 85, 88, 90, 70],
'score2': [89, 92, 76, 88, 90]}
df = pd.DataFrame(data)
print(df)
输出:
name age gender score1 score2
0 Alice 25 F 92 89
1 Bob 23 M 85 92
2 Charlie 29 M 88 76
3 David 32 M 90 88
4 Eva 21 F 70 90
在这个示例中,我们创建了一个DataFrame来表示学生的信息,其中包括姓名、年龄、性别和两个科目的成绩。
行分组
行分组是一种将行按照某个属性分成几类的操作。在Pandas中,我们可以使用groupby方法来对DataFrame进行分组操作。这个方法接收一个函数或列名作为参数,然后将DataFrame中的行按照这个函数或列名对应的属性值进行分组。
例如,我们可以按照性别来分组:
grouped = df.groupby('gender')
for name, group in grouped:
print(name)
print(group)
输出:
F
name age gender score1 score2
0 Alice 25 F 92 89
4 Eva 21 F 70 90
M
name age gender score1 score2
1 Bob 23 M 85 92
2 Charlie 29 M 88 76
3 David 32 M 90 88
在这个示例中,我们按照gender列进行了分组,并将结果输出到了屏幕上。可以看到,通过groupby方法分组后,可以得到一个GroupBy对象,它可以被认为是一个包含若干个数据块的容器。这些块可以通过迭代器遍历或者调用get_group方法来获取。
接下来,我们要根据某些条件将分组后的数据转化为列表。下面是一种常用的方法。
方法一:使用apply和tolist
在Pandas中,我们可以使用apply方法对分组后的数据进行一定的操作,并将结果转化为DataFrame或Series。例如,我们可以使用apply方法计算每个学生的总分,并将结果转化为一个Series:
total_score = df.groupby('gender')[['score1', 'score2']].apply(lambda x: x.sum(axis=1)).reset_index(name='total_score')
print(total_score)
输出:
gender total_score
0 F 181
1 M 341
在这个示例中,我们使用groupby方法将DataFrame按照gender列分组,然后对每组的score1和score2列进行求和操作。注意,我们使用了[[‘score1’, ‘score2’]]来表示我们要对这两列进行操作,并且使用reset_index方法将结果转化为DataFrame,并将新的列命名为total_score。
但是,这种方法仍然不能得到我们想要的列表。因此,我们需要对结果再次进行处理,这里我们使用tolist方法将Series转化为列表:
grouped = total_score.groupby('gender')
for name, group in grouped:
print(name)
print(group['total_score'].tolist())
输出:
F
[181]
M
[341]
这种方法使用了apply和tolist两个方法,虽然看起来较为繁琐,但是它可以解决我们的问题,并能够得到我们想要的结果。
方法二:使用agg和reset_index
在Pandas中,我们可以使用agg方法对分组后的数据进行一定的操作,并将结果转化为DataFrame或Series。例如,我们仍然可以使用agg方法计算每个学生的总分,并将结果转化为一个Series:
total_score = df.groupby('gender')[['score1', 'score2']].agg(lambda x: x.sum()).sum(axis=1).reset_index(name='total_score')
print(total_score)
输出:
gender total_score
0 F 181
1 M 341
在这个示例中,我们使用了agg方法计算每个学生的总分,并将结果转化为DataFrame,并将新的列命名为total_score。和前面的示例类似,我们使用了[[‘score1’, ‘score2’]]来表示我们要对这两列进行操作。
但是,和前面的方法不同的是,我们使用了sum(axis=1)方法来计算每行的总分,并使用reset_index方法将结果转化为DataFrame。
接下来,我们需要对结果再次进行处理,这里我们仍然使用tolist方法将Series转化为列表:
grouped = total_score.groupby('gender')
for name, group in grouped:
print(name)
print(group['total_score'].tolist())
输出:
F
[181]
M
[341]
可以发现,和前面的方法相比,这种方法使用了agg和reset_index两个方法,但是只使用了一次sum方法,并且直接得到了我们想要的结果。因此,在某些情况下,这种方法可能更加简洁有效。
结论
在本文中,我们介绍了如何将DataFrame行分组为列表。我们使用了两种方法:第一种方法使用了apply和tolist两个方法,第二种方法使用了agg和reset_index两个方法。这两种方法都可以得到我们想要的结果,但是具体的实现方式有所不同。在实际应用中,我们需要根据具体的情况选择合适的方法。