在Pandas中分组

2024-04-20 13:50:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚接触熊猫。我对这件事不太了解,所以请对我放轻松。 我试着用一个折线图来描绘2009年到2013年A区和B区火灾的面积和频率。我知道如何导入一个.csv文件,但我有问题分组的系列和创建图形。 我的csv文件如下所示:

Date, Area, NaturalDisaster
12/10/2009, A, Fire
12/13/2009, B, Flood
01/12/2010, B, Fire
05/01/2011, A, Fire
30/11/2012, B, Flood
14/03/2013, B, Fire

你能帮我开始吗。我将感激任何帮助。 非常感谢。你知道吗


Tags: 文件csv图形dateareafire频率面积
1条回答
网友
1楼 · 发布于 2024-04-20 13:50:07

您可以使用^{}对熊猫中的数据进行分组。你知道吗

groupby和类似函数背后的主要思想是"Split - Apply - Combine",一般来说,您可以:

  • 将数据集分组
  • 对每个组应用聚合函数
  • 将它们重新组合在一个新的数据帧中。你知道吗

要获取区域A和B内发生火灾的频率,必须首先仅选择火灾行,而不是洪水行,可以使用boolean indexing和:

df[df['NaturalDisaster']=='Fire']

然后需要根据区域(A或B)进行分组(或拆分)。您只需使用groupby('Area')就可以做到这一点。将此添加到前一行代码中,将变成:

df[df['NaturalDisaster']=='Fire'].groupby('Area')

最后,在pandas中,您需要apply some aggregate function到您的组(apply阶段),我们将使用count()来计算结果的数量。该行随后变为:

df[df['NaturalDisaster']=='Fire'].groupby('Area').count()

但是有个问题。此结果有两列,其中的数字完全相同。这是因为我们同时计算了Date列和NaturalDisaster列。这种重复的信息处理起来很烦人,所以让我们在计算时只取一列。最后一行变成

areas = df[df['NaturalDisaster']=='Fire'].groupby('Area')['NaturalDisaster'].count()

我们现在有了在A区和B区发生的火灾事件的数量,但理想情况下我们需要频率。我们可以通过除以火灾事件的总数得出,火灾事件的总数由sum(areas)给出:

areas /= sum(areas)

我们现在有了一个数据帧,其中包含a区和B区火灾事件的频率

areas.plot(kind='bar')

把所有的代码集中到一堆,它就变成了:

from io import StringIO

import pandas as pd
import matplotlib.pyplot as plt


s = '''Date, Area, NaturalDisaster
12/10/2009, A, Fire
12/13/2009, B, Flood
01/12/2010, B, Fire
05/01/2011, A, Fire
30/11/2012, B, Flood
14/03/2013, B, Fire'''

df = pd.read_csv(StringIO(s), sep=',\s+', engine='python')

# Ignore everything above this part, it's simply creating your dataframe.

areas = df[df['NaturalDisaster']=='Fire'].groupby('Area')['NaturalDisaster'].count() 
areas /= sum(areas)

areas.plot(kind='bar')

plt.show()

Example plot

最后,我使用groupby回答了这个问题,因为您专门询问了这个问题,但是您也可以使用^{}执行相同的操作(以及类似的强大功能)。使用pivot_table创建areas数据帧类似于

areas = pd.pivot_table(df[df['NaturalDisaster']=='Fire'],
                       values='NaturalDisaster', 
                       index='Area', 
                       aggfunc='count')

然后继续使用上面给出的相同代码。你知道吗

相关问题 更多 >