[英]Grouping a series in pandas
我是熊貓新手。 我對此了解不多,所以請放輕松。 我試圖繪制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
所以,請您幫我開始吧。 我將不勝感激。 謝謝。
您可以使用pandas.DataFrame.groupby
對熊貓中的數據進行分組。
groupby
和類似功能背后的主要思想是“拆分-應用-合並” ,通常,您可以:
要獲取在區域A和區域B中發生火災的頻率,您必須首先僅選擇發生火災的行,而不是泛洪行,可以使用布爾索引來實現此目的:
df[df['NaturalDisaster']=='Fire']
然后,您需要根據區域(A或B)進行分組(或分割)。 您可以簡單地使用groupby('Area')
做到這一點。 將其添加到上一行代碼中,將變為:
df[df['NaturalDisaster']=='Fire'].groupby('Area')
最后,在熊貓中,您需要向組中應用一些聚合函數 (應用階段),我們將使用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()
最后,我使用groupby回答了這個問題,因為您特別詢問過它,但是您也可以使用pandas.pivot_table
進行相同的操作(以及類似的功能)。 使用pivot_table
創建areas
數據pivot_table
將類似於
areas = pd.pivot_table(df[df['NaturalDisaster']=='Fire'],
values='NaturalDisaster',
index='Area',
aggfunc='count')
然后,您將繼續執行上述相同的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.