日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

小白学 Python 数据分析(7):Pandas 数据分组

發布時間:2024/1/18 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小白学 Python 数据分析(7):Pandas 数据分组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

各位同學好呀,我又出來了,本篇文章我們介紹下 Pandas 的數據分組。

本文用的數據集再次做更換,有同學在后臺問小編為什么最近每篇文章都在換數據集。

emmmmmmmm,在小白剛入門的時候,很多同學找不到數據集練手,小編盡量多使用一些數據集,傳到代碼倉庫后,大家 Down 下來直接就能使用,給大家多提供幾個案例做選擇。

AkShare

本次的數據集選擇由 AkShare 提供的本次疫情的歷史數據。

AkShare 的簡介:

AkShare 是基于 Python 的開源金融數據接口庫, 目的是實現對股票, 期貨, 期權, 基金, 外匯, 債券, 指數, 數字貨幣等金融產品的基本面數據、實時和歷史行情數據、衍生數據從數據采集, 數據清洗, 到數據落地的一套開源工具, 滿足金融數據科學家, 數據科學愛好者在金融數據獲取方面的需求。

AkShare 的特點是獲取的是相對權威的金融數據網站公布的原始數據, 廣大數據科學家可以利用原始數據進行各數據源之間的交叉驗證, 進而再加工, 從而得出科學的結論。

好像和疫情沒什么關系么,其實 AkShare 也是在最近的更新中添加了有關本次疫情的數據集。

首先第一件事兒就是先把我們今天要使用到的數據集搞下來,首先是 AkShare 的安裝,參考文檔示例進行安裝( https://akshare.readthedocs.io/zh_CN/latest/akshare/ak-installation.html ):

  • 通用安裝:
    pip install akshare --upgrade

  • 國內安裝-Python:
    pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --upgrade

  • 國內安裝-Anaconda:
    pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --user --upgrade

除了一些 Python 的庫需要進行安裝,還有一些其他環境需要安裝,小編這里就不一一列出了,請各位同學參考文檔進行安裝。

安裝好以后,將本次疫情的歷史數據進行導出成 Excel ,然后開始我們今天的正題,這段導出代碼其實非常簡單,加上導包總共三行,如下:

import akshare as akepidemic_dxy_df = ak.epidemic_dxy(indicator="global") epidemic_dxy_df.to_excel('epidemic_dxy.xlsx')

這里獲取的其實是本次疫情截止小編寫這篇文章時的一個最新數據。

說明: epidemic_dxy_df 是一個 DataFrame ,這里直接通過 DataFrame 的 to_excel 進行 Excel 導出。

如果不想使用 Excel 的同學,也可以直接操作 epidemic_dxy_df 這個 DataFrame ,只是每次運行的時候它都要從遠端拉取數據,速度上挺慢的,從本地的 Excel 中讀取數據還是會快很多。

導出的 Excel 小編就簡單截個圖,如圖:

可以看到,總共有 66 行的數據,數據量不大,我們進行操作后,可以人工核實操作數據是否正確。

數據分組

如果有對 SQL 使用經驗的同學來講,分組這個詞并不陌生,在 SQL 中的關鍵字是 group by ,而在 Pandas 中的方法名也十分相似,是 groupby() 。
當然,如果對 SQL 不熟悉的同學也可以參考下 Excel 的分組,都是一樣的。
我們先按照七大洲對這個數據做一次分組,看下是什么結果:

import pandas as pd# 數據導入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")print(epidemic_dxy.groupby(['continents']))# 輸出內容 <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000019AB24BAB48>

可以看到,這里輸出的了一個 DataFrameGroupBy 的內存對象,實際上這個對象中包含了分組后的一些相關信息,并沒有直接顯示出來,我們直接調用一個匯總的方法看一下:

print(epidemic_dxy.groupby(['continents']).count())# 輸出內容id createTime modifyTime ... operator locationId countryShortCode continents ... 亞洲 26 26 26 ... 26 26 26 其他 1 1 1 ... 1 1 1 北美洲 4 4 4 ... 4 4 4 南美洲 2 2 2 ... 2 2 2 大洋洲 2 2 2 ... 2 2 2 歐洲 27 27 27 ... 27 27 27 非洲 3 3 3 ... 3 3 3

count() 的含義是取計數,就是當前的數據有多少條,可以看到,亞洲有 26 條數據。
如果我想知道當前七大洲的匯總數據呢?可以用到 sum() 這個方法:

import pandas as pd# 數據導入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")pd.set_option('display.max_columns', None) print(epidemic_dxy.groupby(['continents']).sum())# 輸出內容id createTime modifyTime tags countryType \ continents 亞洲 18446021 41161613744000 41161613744000 0.0 52 其他 709404 1583138990000 1583138990000 0.0 2 北美洲 2838116 6332555961000 6332555961000 0.0 8 南美洲 1419041 3166277981000 3166277981000 0.0 4 大洋洲 1418867 3166277980000 3166277980000 0.0 4 歐洲 19156076 42744752735000 42744752735000 0.0 54 非洲 2128329 4749416970000 4749416970000 0.0 6 provinceId provinceShortName cityName currentConfirmedCount \ continents 亞洲 231 0.0 0.0 5458 其他 10 0.0 0.0 699 北美洲 38 0.0 0.0 99 南美洲 20 0.0 0.0 8 大洋洲 20 0.0 0.0 14 歐洲 265 0.0 0.0 2040 非洲 30 0.0 0.0 3 confirmedCount suspectedCount curedCount deadCount comment \ continents 亞洲 5940 0 399 83 0.0 其他 705 0 0 6 0.0 北美洲 107 0 7 1 0.0 南美洲 8 0 0 0 0.0 大洋洲 30 0 15 1 0.0 歐洲 2199 0 123 36 0.0 非洲 4 0 1 0 0.0 sort locationId continents 亞洲 0 24793190 其他 0 0 北美洲 0 3887012 南美洲 0 1946009 大洋洲 0 1980008 歐洲 0 25035128 非洲 0 2944016

因為原始數據有點多,小編這里將所有的列全展示出來,可以看到亞洲目前的確診數量是 5940 ,當然,這里不包含中國的數據。

這里的列太多了,很多列并不是我們關心的,如果我們只關心幾個核心的數據怎么展示呢?

我們可以先分組,分組后取出我們需要的列,然后再對列做運算,如下:

import pandas as pd# 數據導入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")print(epidemic_dxy.groupby(['continents'])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum())# 輸出內容confirmedCount suspectedCount curedCount deadCount continents 亞洲 5940 0 399 83 其他 705 0 0 6 北美洲 107 0 7 1 南美洲 8 0 0 0 大洋洲 30 0 15 1 歐洲 2199 0 123 36 非洲 4 0 1 0

在進行數據分組的時候,我們除了可以使用列名進行分組,還可以使用 Series 進行分組,它與使用列名進行分組在使用上沒有任何不同:

import pandas as pd# 數據導入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")print(epidemic_dxy.groupby(epidemic_dxy['continents'])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum())# 輸出內容confirmedCount suspectedCount curedCount deadCount continents 亞洲 5940 0 399 83 其他 705 0 0 6 北美洲 107 0 7 1 南美洲 8 0 0 0 大洋洲 30 0 15 1 歐洲 2199 0 123 36 非洲 4 0 1 0

這里的 epidemic_dxy[‘continents’] 本身就是一個 Series ,可以看到和上面使用列名進行分組無任何不同。
在分組的時候,除了可以使用一個列或者 Series ,還可以使用多個,只需要在 groupby() 的參數中進行添加即可,如下:

import pandas as pd# 數據導入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")print(epidemic_dxy.groupby([epidemic_dxy['continents'], epidemic_dxy['provinceName']])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum())# 輸出內容confirmedCount suspectedCount curedCount deadCount continents provinceName 亞洲 亞美尼亞 1 0 0 0以色列 10 0 1 0伊拉克 19 0 0 0伊朗 978 0 175 54卡塔爾 1 0 0 0 ... ... ... ... ... 歐洲 荷蘭 10 0 0 0西班牙 84 0 2 0 非洲 埃及 2 0 1 0尼日利亞 1 0 0 0阿爾及利亞 1 0 0 0[65 rows x 4 columns]

我們這里使用了七大洲和國家進行分組,可以看到整個求和的數據集已經按照七大洲和國家求和列出了。
你以為分組到這里就算完了?
nonono,下面還有個神奇的家伙 —— aggregate() 。
aggregate() 這個方法是做什么的呢?
如果我們想在一次分組中,進行兩次匯總運算,那么,就要用到這個函數了,比如,我想在剛才的數據中先計數,在求和,那么可以這么寫:

import pandas as pd# 數據導入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")print(epidemic_dxy.groupby(epidemic_dxy['continents'])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].aggregate(['count', 'sum']))# 輸出內容count sum count ... sum count sum continents ... 亞洲 26 5940 26 ... 399 26 83 其他 1 705 1 ... 0 1 6 北美洲 4 107 4 ... 7 4 1 南美洲 2 8 2 ... 0 2 0 大洋洲 2 30 2 ... 15 2 1 歐洲 27 2199 27 ... 123 27 36 非洲 3 4 3 ... 1 3 0[7 rows x 8 columns]

怎么樣,是不是很神奇,左邊是計數,右邊是求和。

不過有一點要注意下,在我們對數據進行分組運算完成后,有時候會需要對數據進行進一步的處理,由于分組運算后的結果并不是標準的 DataFrame 形式,需要我們對它進行進一步的轉化,這里用到的方法就是重置索引 reset_index() 。

import pandas as pd# 數據導入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")new_dataframe = epidemic_dxy.groupby(epidemic_dxy['continents'])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum().reset_index()print(new_dataframe)# 輸出內容continents confirmedCount suspectedCount curedCount deadCount 0 亞洲 5940 0 399 83 1 其他 705 0 0 6 2 北美洲 107 0 7 1 3 南美洲 8 0 0 0 4 大洋洲 30 0 15 1 5 歐洲 2199 0 123 36 6 非洲 4 0 1 0

這樣,我們就得到了一個新的 DataFrame ,可以在這個新的 DataFrame 進行新的騷操作了。

本篇的內容到這里才算結束,各位看更的同學,記得要手寫代碼哦~~~

總結

以上是生活随笔為你收集整理的小白学 Python 数据分析(7):Pandas 数据分组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。