您好,登錄后才能下訂單哦!
本篇內容介紹了“python的pandas有哪些基本操作”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
python 的 pandas 庫用來處理表格類型(也就是矩陣)的數據非常方便, 這個庫用來在可視化之前對數據進行變換,計算和匯總之類的操作再好不過。
下面整理了最近我在做數據分析的短視頻時常用的一些方法。
做視頻之前,我采集的數據都是用 csv 格式保存的,這里主要演示 pandas 庫的 read_csv 方法。 讀取其他文件格式的方式類似,主要是函數名稱不同,參數都差不多。
讀取 csv 文件非常簡單,指定 csv 文件的路徑即可。 測試用 csv 文件內容如下:
IP地址,手機號,登錄日期 223.104.147.75,19951762925,"2021-04-15 01:33:08" 117.181.52.75,15873565020,"2021-04-15 01:48:24" 42.49.165.99,18673535620,"2021-04-15 02:14:40" 14.116.141.24,18673535620,"2021-04-15 05:01:40"
# -*- coding: utf-8 -*- import pandas as pd def test(): df = pd.read_csv( "~/share/test.csv", ) print(df) if __name__ == "__main__": test()
程序運行結果:
$ python test.py IP地址 手機號碼 登錄日期 0 223.104.147.75 1.995176e+10 2021-04-15 01:33:08 1 117.181.52.75 1.587357e+10 2021-04-15 01:48:24 2 42.49.165.99 1.867354e+10 2021-04-15 02:14:40 3 14.116.141.24 1.867354e+10 2021-04-15 05:01:40
csv 文件中的列名有時候沒有,或者有時候是中文的,列名是后續進行操作數據時使用的 key,一般在讀取時將其轉換成英文。 同時,可以看出手機號碼默認被當成數值類型了,所以用科技計數法來表示,在讀取數據時,可以設置此列為字符串類型。
# -*- coding: utf-8 -*- import pandas as pd def test(): df = pd.read_csv( "~/share/test.csv", skiprows=[0], names=["ip", "mobile", "login_date"], dtype={"mobile": str}, ) print(df) if __name__ == "__main__": test()
skiprows 可以用來忽略第一行標題,因為我們用 names 指定了新的標題名稱。
dtype 用來指定某列的類型,不指定的話,系統自動推斷類型。
程序運行結果:
$ python test.py ip mobile login_date 0 223.104.147.75 19951762925 2021-04-15 01:33:08 1 117.181.52.75 15873565020 2021-04-15 01:48:24 2 42.49.165.99 18673535620 2021-04-15 02:14:40 3 14.116.141.24 18673535620 2021-04-15 05:01:40
列的名稱已替換,手機號碼也正常顯示。
在分析數據時,有時候我們不需要采集的所有數據,只取其中需要的幾列數據。 比如上面的 csv,如果只分析 IP 地址和登錄時間,讀取文件時,可以只取這 2 列數據。
# -*- coding: utf-8 -*- import pandas as pd def test(): df = pd.read_csv( "~/share/test.csv", skiprows=[0], usecols=[0, 2], names=["ip", "login_date"], ) print(df) if __name__ == "__main__": test()
通過 usecols 來指定需要那幾列。 程序運行結果:
$ python test.py ip login_date 0 223.104.147.75 2021-04-15 01:33:08 1 117.181.52.75 2021-04-15 01:48:24 2 42.49.165.99 2021-04-15 02:14:40 3 14.116.141.24 2021-04-15 05:01:40
有些列的格式,比如日期格式的列,可能在分析之前就要進行轉換處理。 上面的例子中,如果是按日分析登錄情況,就不要時分秒的部分,這樣我們可以在讀取時就進行轉換處理。
# -*- coding: utf-8 -*- from datetime import datetime import pandas as pd def test(): df = pd.read_csv( "~/share/test.csv", skiprows=[0], usecols=[0, 2], names=["ip", "login_date"], converters={ "login_date": lambda d: datetime.strptime(d, "%Y-%m-%d %H:%M:%S").strftime( "%Y-%m-%d" ) }, ) print(df) if __name__ == "__main__": test()
通過 converters 參數轉換某列。 程序運行結果:
$ python test.py ip login_date 0 223.104.147.75 2021-04-15 1 117.181.52.75 2021-04-15 2 42.49.165.99 2021-04-15 3 14.116.141.24 2021-04-15
讀取文件之后,得到一個 dataframe 結構,它可以當成一個矩陣來看。 基于 dataframe,可以完成各種計算操作,pandas 提供的 API 也很多,這里只介紹我平時常用的一部分。
之前做房價分析時,按月分析成交平均值和成交總套數時,都用到了分組統計。 分析的第一步就是將數據分組。
# -*- coding: utf-8 -*- import pandas as pd test_data = { "name": ["a", "b", "c", "d"], "value": [11, 20, 31, 42], "date": ["2017", "2018", "2018", "2017"], } def main(): df = pd.DataFrame(test_data) data = df.groupby("date") data = data.sum() print(data) if __name__ == "__main__": main()
按照日期分組之后,運行結果如下:
$ python test2.py value date 2017 53 2018 51
這里是求和,groupby 之后同樣也可以求平均值。
數據集變換是用的比較多的,因為采集和分析的過程是分開的,采集的目的是數據盡量全和準確。 所以分析之前會根據分析目的會對數據進行適當的變換。
行操作主要指從數據集中過濾出一部分數據,或者合并多個數據集。
過濾數據
# -*- coding: utf-8 -*- import pandas as pd test_data = { "name": ["a", "b", "c", "d"], "value": [11, 20, 31, 42], "date": ["2017", "2018", "2018", "2017"], } def main(): df = pd.DataFrame(test_data) # 選取2017年的數據 data2017 = df[df["date"] == "2017"] print(data2017) # 選取value>30 的數據 data30 = df[df["value"] > 30] print(data30) if __name__ == "__main__": main()
運行結果如下:
$ python test2.py name value date 0 a 11 2017 3 d 42 2017 name value date 2 c 31 2018 3 d 42 2017
可以很方便的直接使用列名來過濾數據行
合并數據集
# -*- coding: utf-8 -*- import pandas as pd test_data_01 = { "name": ["a", "b", "c", "d"], "value": [11, 20, 31, 42], "date": ["2017", "2018", "2018", "2017"], } test_data_02 = { "name": ["a", "b", "c", "d"], "value": [31, 40, 51, 72], "date": ["2019", "2020", "2020", "2019"], } def main(): df01 = pd.DataFrame(test_data_01) df02 = pd.DataFrame(test_data_02) # 合并數據集時,設置 ignore_index = True,可以避免index重復 data = pd.concat([df01, df02], ignore_index=True) print(data) if __name__ == "__main__": main()
運行結果如下:
$ python test2.py name value date 0 a 11 2017 1 b 20 2018 2 c 31 2018 3 d 42 2017 4 a 31 2019 5 b 40 2020 6 c 51 2020 7 d 72 2019
如果不設置 ignore_index = True,執行結果如下:(注意第一列有重復)
$ python test2.py name value date 0 a 11 2017 1 b 20 2018 2 c 31 2018 3 d 42 2017 0 a 31 2019 1 b 40 2020 2 c 51 2020 3 d 72 2019
列操作我用到的場景,有一個是橫向統計各個列的合計和平均值。 示例如下:
# -*- coding: utf-8 -*- import pandas as pd test_data_01 = { "a": [11, 20], "b": [1, 2], } def main(): df = pd.DataFrame(test_data_01) df["a+b"] = df["a"] + df["b"] df["(a+b)/2"] = (df["a"] + df["b"]) / 2 print(df) if __name__ == "__main__": main()
運行結果如下:
$ python test2.py a b a+b (a+b)/2 0 11 1 12 6.0 1 20 2 22 11.0
還有就是進行數據集的列合并,比如將多個數據集的統計結果進行合并:
# -*- coding: utf-8 -*- import pandas as pd test_data_01 = { "a": [11, 20], "b": [1, 2], } test_data_02 = { "c": [18, 50], "d": [31, 32], } def main(): df01 = pd.DataFrame(test_data_01) df02 = pd.DataFrame(test_data_02) df01["a+b"] = df01["a"] + df01["b"] df01["(a+b)/2"] = (df01["a"] + df01["b"]) / 2 df01 = df01.drop(columns=["a", "b"]) df02["c+d"] = df02["c"] + df02["d"] df02["(c+d)/2"] = (df02["c"] + df02["d"]) / 2 df02 = df02.drop(columns=["c", "d"]) df = pd.concat([df01, df02], axis=1) print(df) if __name__ == "__main__": main()
運行結果如下:
$ python test2.py a+b (a+b)/2 c+d (c+d)/2 0 12 6.0 49 24.5 1 22 11.0 82 41.0
行列互換我一般是在做動態短視頻時使用的,把每個時間點一行數據(數據包含各個元素),變成每個元素在每個時間點一個數據。
開始時,數據類似:
date,a,b 2017,1,2 2018,2,3
轉換后變成:
key,date,value a,2017,1 a,2018,2 b,2017,2 b,2018,3
轉換代碼:
# -*- coding: utf-8 -*- import pandas as pd test_data = { "date": ["2017", "2018"], "a": [1, 2], "b": [2, 3], } def main(): df = pd.DataFrame(test_data) print("轉換前:>>>>>>") print(df) data = df.drop(columns=["date"]) data = pd.melt(data) df_date = pd.concat([df["date"]] * 2, ignore_index=True) data = pd.concat([df_date, data], axis=1) print("\n轉換后:>>>>>>") print(data) if __name__ == "__main__": main()
運行結果如下:
$ python test2.py 轉換前:>>>>>> date a b 0 2017 1 2 1 2018 2 3 轉換后:>>>>>> date variable value 0 2017 a 1 1 2018 a 2 2 2017 b 2 3 2018 b 3
導出文件很簡單,只要指定個路徑即可(注意,路徑不存在會報錯)。
data.to_csv("./test.csv")
導出時,如果不想導出每行數據的序號,加上 index=False
data.to_csv("./test.csv", index=False)
如果給標題行重新命名成易懂的中文名稱,設置 header 參數。
data.to_csv( "./test.csv", index=False, header=[ "日期", "名稱", "時間(小時)", ], )
掌握了 pandas,感覺是多了一件隨便操作數據集的利器,能夠極大節省調整數據的時間。 而且,它的處理速度極快,我在自己的筆記本電腦上處理成千上萬條數據時基本都是瞬間完成,同樣的數據,我用 excel 來處理,會卡頓很多。
“python的pandas有哪些基本操作”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。