Python3:Pandas的簡單使用3(針對DataFrame的操作:賦值,計算,統計,畫圖以及io操作)

1.聲明

當前的內容包括Pandas中對DataFrame的數據運算和統計運算操作,然後就是畫圖操作,用於本人知識梳理和複習

2.一個demo

## 使用當前的pandas實現數據計算操作
import numpy as np
import pandas as pd

shops = pd.DataFrame(np.random.randint(1, 10, (5, 5)), index=["第{}天".format(i + 1) for i in range(5)],
                     columns=["第{}家店".format(i + 1) for i in range(5)])
print("輸出銷售信息:\n{}".format(shops))

print("輸出/2後的結果:\n{}".format(shops / 2))
# 由於第一家店出現熱銷,當前的數據變成 原來的 150%
# shops["第1家店"] = shops["第1家店"] * 1.5  # 這裏出現錯誤
# shops.loc["第3天"]["第4家店"] = 15
# SettingWithCopyWarning:
# A value is trying to be set on a copy of a slice from a DataFrame

print("輸出銷售信息:\n{}".format(shops))

# 發現第4家店的銷售數據的第三天的數據寫錯誤了 應該爲 15
shops.loc["第3天", "第4家店"] = 15
print("輸出銷售信息:\n{}".format(shops))
shops.loc["第3天"]["第4家店"] = 17
print("輸出銷售信息:\n{}".format(shops))

# 說明當前使用賦值的時候必須按照同一格式或者方式來操作計算,否則會報錯的
shops.loc["第3天"] = 13
print("輸出銷售信息:\n{}".format(shops))

# shops.loc["第4家店"] = 14
# print("輸出銷售信息:\n{}".format(shops))
# 發現這裏出現了問題,直接在當前的數據中追加了一行數據爲 13 index爲第4家店的數據,這是一個坑

# 算出當前第一家店的所有和
print("輸出當前第一家店的利潤總和:{}".format(shops["第1家店"].sum()))

# 輸出第一家店和第3家店的每天的利潤和
one_shop = shops["第1家店"]
two_shop = shops["第3家店"]
print("第一家店和第3家店的利潤和:\n{}".format(one_shop.add(two_shop)))
print("輸出銷售信息:\n{}".format(shops))
# 輸出第一家店和第3家店每天的利潤差
print("第1家店和第3家店的利潤差:\n{}".format(one_shop.sub(two_shop)))

print("輸出當前利潤大於4的數據:\n{}".format(shops > 4))
# 發現這裏輸出的數據又是布爾數組
# 按照同理操作可以實現
print("輸出當前利潤大於4的數據:\n{}".format(shops[shops > 4]))
# 發現所有不符合的數據都變成了NaN這個
# 將所有小於等於4的數據都變成 4
shops[shops <= 4] = 4
print(print("輸出當前利潤大於4的數據:\n{}".format(shops)))

# 輸出第二家店的數據中的利潤大於5並且小於 8的利潤
print("==============輸出第二家店的數據中的利潤大於5並且小於 15的利潤===============")
two_shop = shops["第2家店"]
print("輸出第2家店的數據:\n{}".format(two_shop))
boolean_array = ((shops["第2家店"] > 5) & (shops["第2家店"] < 15))
print(boolean_array)
print("=================================================")
print("輸出第二家店的數據中的利潤大於5並且小於 15的利潤:\n{}".format(two_shop[boolean_array]))

# 使用當前的query方法執行邏輯運算操作
print("使用當前的query的查詢解析:\n{}".format(shops.query("第2家店>4 & 第2家店<15")))
# indexs = [i for i in shops.index]
# print(indexs)
## 輸出前2天銷售前2的數據

# 輸出當前的銷售數據中是否有達到 5,7,9的數據,isin方法判斷當前的數組中的數據是否包含這些數據
print("輸出當前的銷售數據中是否有達到 5,7,9的數據:\n{}".format(shops.isin([5, 7, 9])))
print("輸出當前的銷售數據中是否有達到 5,7,9的數據:\n{}".format(shops[shops.isin([5, 7, 9])]))

# 輸出前兩個數據
two_days_records = shops.head(2)
print("輸出前兩天的銷售情況:\n{}".format(two_days_records))
# print("輸出前2的數據:\n{}".format(two_days_records.sort_index(axis=1,ascending=False)))
# print("輸出前2的數據:\n{}".format(two_days_records.sort_index(axis=0,ascending=False)))

# 輸出最大的兩個值
print("輸出前2的數據:\n{}".format(two_days_records.max(axis=1)))

# 使用當前的describe方法
print("調用當前的describe這個方式=============")
print(shops.describe())
# 使用當前的describe這個方式會返回當前的count屬性異界一些統計函數的數據

# 輸出最大值所在的索引和最小值所在的索引
print(shops)
print("輸出最大值的索引:\n{}".format(shops.idxmax()))
print("輸出最小值的索引:\n{}".format(shops.idxmin()))
# 這個返回的索引是先是行索引然後是列索引

# 統計某列的累積求和
print(shops["第3家店"].cumsum())  # 就像當於每天的這家店的總利潤

# 使用當前的數據進行畫圖操作,pandas本身集成了matplotlib這個東西
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False
# 由於當前的pandas原本是集成了matplotlib這個東西,所以當前是支持畫圖操作的
shops["第3家店"].cumsum().plot()
shops.plot()
plt.show()

# 自定義運算 :使用當前的apply()函數來實先運算操作,主要使用的是lambda
print("使用當前的自定函數的方式實現當前的計算操作:\n{}".format(shops.apply(lambda x: x.max() - x.min())))

在這裏發現了一個問題:

shops[“第1家店”] = shops[“第1家店”] * 1.5 # 這裏出現錯誤
shops.loc[“第3天”][“第4家店”] = 15
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

以上中如果存在修改了數據然後再使用loc方法操作的時候就會出SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

結果:
在這裏插入圖片描述

在這裏插入圖片描述

總結:

1.可以直接使用DataFrame數據進行任何運算操作,以及邏輯運算操作,基本上與numpy中的使用方法一致

2.可以直接使用等號方式爲指定的行或者列以及指定的特定數據賦值

3.還可以使用DataFrame.sub()和add()方式以及其他的方式實現各種計算操作

4.可以使用query()方法簡化查詢數據和賦值操作

5.通過DataFrame.isin()判斷是否包含某些特定的數據

6.可以直接使用Pandas中的plot完成畫圖操作

7.還可以自定義運算方式:DataFrame.apply()

8.可以直接使用numpy中的統計操作

3.讀取和寫入文件操作

3.1 讀取CSV文件

這裏存在一個test.csv文件

,第1家店,第2家店,第3家店,第4家店,第5家店
第1天,4,6,7,3,7
第2天,9,5,7,6,8
第3天,9,2,6,7,5
第4天,1,1,7,3,4
第5天,4,3,5,4,3

# 使用當前的pandas實現讀取csv文件
import pandas as pd

# 當前的讀取操作就是出現一個問題,如果使用直接讀取的話這個index就會默認生成一個Unamed:0然後所有行的第一個都會變成[0-5]
# 讀取文件的操作的時候可以指定當前的index_col = False表示取消當前默認生成的index索引列,使用index_col=0表示讀取到的數據就是第一行的數據作爲索引
# 還可以指定當前的use_cols=列名的方式指定讀取那一列的數據,或者是指定列的數據
pd_DataFrame = pd.read_csv("test.csv", index_col=0)
print(pd_DataFrame)

1.讀取文件的時候可以指定當前的index_col,和讀取指定的列方式use_cols

2.讀取csv直接使用pd.read_csv()

3.2 寫入CSV文件

# 寫入csv文件
import numpy as np
import pandas as pd

indexs = ["第{}天".format(i + 1) for i in range(5)]
columns = ["第{}家店".format(i + 1) for i in range(5)]
pd_dataaFrame = pd.DataFrame(np.random.randint(1, 10, (5, 5)), index=indexs, columns=columns)
print("輸出當前的產生的二維數據:\n{}".format(pd_dataaFrame))

# 這裏的to_csv方法就是將當前的數據保存下來,可以指定當前是否保存行和列索引,還可以使用過濾的方式實現操作和數據的保存
# 當前還可以使用當前的model表示使用的模式是追加模式還是寫入模式,並且還可以指定當前的header=False方式表示第二次寫入的時候不需要表頭
pd_dataaFrame.to_csv("test.csv")


直接使用pd.to_csv方式寫出數據到文件中

3.3 讀取和寫入json文件

這裏準備文件
在這裏插入圖片描述

# 將當前的數據結果存儲爲json文件
import pandas as pd
import numpy as np

np_random = np.random.randint(1, 100, (10000, 5))
columns = ["{}_shop".format(i + 1) for i in range(5)]
indexs = ["{}_good".format(i + 1) for i in range(10000)]
pd_dataFrame = pd.DataFrame(np_random, index=indexs, columns=columns)
# pd_dataFrame.to_excel("test.xlsx") 寫入excel需要excel的模塊
# pd_dataFrame.to_json("test.json",orient="records",lines=True)
pd_dataFrame.to_json("test.json",orient="records")
# 如果不指定當前的lines默認就是False,但是這個數據不符合json的規範,json中數據是有分隔符的:,
# 指定lines=True的時候默認數據就是顯示在一行的
# 發現當前指定的index失效,在數據上沒有任何顯示
print(pd_dataFrame.head(5))
# 最後讀取文件
pd_json = pd.read_json("test.json",orient="records",lines=False)
print(pd_json.head(5))

1.這裏需要注意讀取和寫入的時候需要指定當前的lines,lines表示是否一行一行的讀取或者寫入,需要指定orient

2.讀取和寫入使用pd.read_json()和pd.to_json()文件

3.5 讀取和寫出HDF5文件

1.讀取HDF5文件

# 讀取當前寫入的HDF5文件,test.h5
import pandas as pd

pd_dataFrame = pd.read_hdf("test.h5")
print(pd_dataFrame)

# 使用讀取文件的時候指定當前的key方式讀取文件
pd_dataFrame2 = pd.read_hdf("test.h5", key="sells")
print(pd_dataFrame2)
# 測試都成功!
# 由於當前的hdf5文件的格式位:key:value這種格式,但是如果這個文件中只有一個key就表示讀取的時候不需要指定格式

# 如果當前的hdf5文件中存在多個key就會報錯
# 開始再向當前的test.h5文件中寫入另外一個key
pd_dataFrame2.to_hdf("test.h5",key="sells2")
# 再次讀取文件的時候就報錯了



2.寫出HDF5文件

# 使用當前的pandas寫入一個hdf5格式的文件,就是一個基於hadoop大數據的存儲系統(存儲)
# 注意讀取當前的HDF5數據的時候需要使用當前tables庫,如果沒有的話就會報錯
# 當前使用的tables庫位 3.6.1
import pandas as pd
import numpy as np

columns = ["第{}家".format(i + 1) for i in range(10)]
indexs = ["第{}家".format(i + 1) for i in range(100)]
pd_dataFrame = pd.DataFrame(np.random.randint(1, 100, (100, 10)), index=indexs, columns=columns)
# print(pd_dataFrame.head(10))
# 數據生成成功
# 現在開始保存數據
# pd_dataFrame.to_hdf("test.h5")
# TypeError: to_hdf() missing 1 required positional argument: 'key' 這裏說明保存的時候必須要指定當前的key
pd_dataFrame.to_hdf("test.h5",key="sells")

總結:

1.讀取的時候,如果HDF5文件中只有一個key的時候,可以不指定讀取的key,如果HDF5中不止一個key的時候必須要指定讀取的key,否者報錯

2.寫入HDF5文件的時候一定要指定key,否者報錯

3.使用pd.read_hdf()和pd.to_hdf()方式讀取和寫入HDF5文件

4.總結

1.再賦值操作的時候需要注意當前存在的問題

2.可以使用numpy方式中的操作運算符方式對pandas的DataFrame實現相同的操作

3.可以直接使用plot實現畫圖,但是需要matplotlib來show出來

4.io操作的時候需要注意讀寫文件的方式,每一個方式都不一樣

以上純屬個人見解,如有問題請聯繫本人!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章