1.Pandas基本構成
引入Pandas
import pandas as pd
1.Series 行
對應Excel中的一行數據,一維數據
定義Series
# 第一個參數是具體數據
# 第二個參數的對應的索引下標
# 第三個參數的行名稱
data = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'], name='data')
print(data)
# 輸出Series對象的索引
print(data.index)
# 輸出Series對象里面索引為 'a'的值
print(data['a'])
執行結果:
2.DataFrame 表
對應Excel表,二維數據,類似于二維數組,由Series組成
定義DataFrame
# 定義DataFrame
# 先定義單獨的每一行
s1 = pd.Series([1, 2, 3, 4, 5], index=['a','b','c','d','e'], name='A')
s2 = pd.Series([10, 20, 30, 40, 50], index=['a','b','c','d','e'], name='B')
s3 = pd.Series([100, 200, 300, 400, 500], index=['a','b','c','d','e'], name='C')
df = pd.DataFrame([s1, s2, s3])
print(df)
# 字典方式定義
# 輸出結果與上方 行列顛倒
df2 = pd.DataFrame({s1.name: s1, s2.name: s2, s3.name: s3})
print(df2)
執行結果:
2.Pandas基本操作
1.讀取寫入數據?
1.讀取數據
import pandas as pd# 讀取
# pandas讀取時會自動跳過空行
# header參數可以指定跳過哪一行
# 讀取時會產生默認的索引
file_path = "test.xlsx"
data = pd.read_excel(file_path, header=2, sheet_name="Sheet1")
print(data)# index_col 指定索引列
# dtype 轉換指定列的數據類型
data1 = pd.read_excel(file_path, sheet_name="Sheet1", index_col='name', dtype={"age": int})
print(data1)
執行結果
2.寫入數據
# 寫入
df = pd.DataFrame({"id": [1, 2, 3, 4, 5],"name": ["張三", "李四", "王五", "劉大", "關二"],"age": [10, 20, 30, 40, 50]
})
# 自定義索引
df = df.set_index("id")
df.to_excel("test.xlsx")
如果寫入時to_excel方法報錯,則下載openpyxl解決
from openpyxl import Workbook
執行結果:
?2.對數據進行排序
import pandas as pd# 讀取文件
people = pd.read_excel('test.xlsx', index_col="id")
# by 根據哪一列進行排序
# inplace 是否用排序后的數據集替換原來的數據,默認為False,即不替換
# ascending 是否按照升序排序,默認升序,False為降序
# na_position 設定缺失值的顯示位置 first lase
people.sort_values(by="age", inplace=True, ascending=False, na_position="first")
print(people)# 根據多個列進行排序
peoples = pd.read_excel('test.xlsx', index_col="id")
peoples.sort_values(by=["age", "name"], ascending=[True, False], inplace=True)
print(peoples)
3.數據過濾
讀取列或行數據時,其索引必須存在,否則報錯
import pandas as pdpeople = pd.read_excel("test.xlsx", index_col="id")
# 判斷數據行中是否有缺省值
print(people.isnull().any)
# 刪除數據中的缺省值
people.dropna(inplace=True)
# 過濾數據中符合條件的數據
# [] 里面直接寫條件
result = people[(people["name"] == "張三") & (people["age"] >= 10)]
print(result)# 定義一個函數
def age_10_to_50(a):return 10 <= a <= 50def score_10_to_50(a):return 0 <= a <= 60# loc方法是讀取文件行列數據的方法,可以讀取指定行,列,區域的數據
result_10_to_50 = people[people["name"] == "張三"].loc[people["age"].apply(age_10_to_50)].loc[people["score"].apply(score_10_to_50)]
print(result_10_to_50)
4.Excel數據拆分
本質還是使用了字符串的split方法
import pandas as pdpeople = pd.read_excel("test.xlsx", index_col="id")# 將name拆分
df = people["name"].str.split(expand=True)
# 保存拆分出來的數據 保存前全部表中有這兩列
people["姓氏"] = df[0]
people["名字"] = df[1]
print(people)
5.多表聯合操作
import pandas as pdstudent = pd.read_excel("test.xlsx")
score = pd.read_excel("test1.xlsx")
age = pd.read_excel("test2.xlsx")# how 指定連接方式,默認inner 內連, left,right,outer 類似數據庫多表查詢
# on 用于連接的列名,必須同時存在與左右兩個DataFrame對象中
# left_on,right_on 左右測用于連接的列
# left_index,right_index 如果為True,則使用左右側的行索引作為其連接鍵
# sort 是否按照字典順序通過連接鍵對結果DataFrame排序
# suffixes 用于重疊列的字符串后綴元組
# copy 是否總是從傳遞的DataFrame對象復制數據,默認為True
# indicator 如果為True,則添加一個名為_merge的特殊列,顯示每列的合并信息
# fillna() 如果單元格為空,則填充指定數據
table = student.merge(score, how='left', on="id").fillna(0)
table["分數"] = table["分數"].astype(int)table2 = table.merge(age, how='left', on="id").fillna(0)
table2["年齡"] = table2["年齡"].astype(int)print(table2)
6.統計運算
import pandas as pddf = pd.DataFrame([[1, 2, 3], [2, 2, 3], [3, 3, 3]], columns=['A', 'B', 'C'])
print(df)# 求某一行平均數或列
# mean 計算平均值方法
# axis 0:按列計算 1:按行計算
# skipna:是否忽略缺失值,默認為True
print(df.mean(axis=1))
# drop 刪除指定標簽的行或列
# axis 0:刪除索引 1:刪除列
# inplace False:返回一個副本 True:在原地刪除并返回None
print(df.drop("A", axis=1))people = pd.read_excel("test1.xlsx")
columns_name = ["A", "B", "C"]
# 對行求平均值,總和
row_mean = people[columns_name].mean(axis=1)
row_sum = people[columns_name].sum(axis=1)
total = "總分"
average = "平均分"
people[total] = row_sum
people[average] = row_mean
columns_name += [total, average]
# 對列求平均值
col_mean = people[columns_name].mean()
# 給結果行中加個名字
col_mean["名稱"] = "Summary"
people = people._append(col_mean, ignore_index=True)
print(people)
7.數據可視化
設置字體部分很重要
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt# 設置顯示中文字體 黑體 重要
matplotlib.rcParams["font.sans-serif"] = ["SimHei"]
# 設置正常顯示符合
matplotlib.rcParams["axes.unicode_minus"] = False# 解決matplotlib版本與pandas沖突
matplotlib.use("TkAgg")
# matplotlib 常用繪圖工具students = pd.read_excel("test1.xlsx")
name = "名稱"
score = "分數"
age = "年齡"
students.sort_values(by=score, inplace=True, ascending=False)
# 繪制圖片
plt.bar(students[name], students[score], color="blue")
# 設置標題
plt.title("Student Score", fontsize=16)
# 設置X軸與Y軸的名稱
plt.xlabel("Name", fontsize=16)
plt.ylabel("Score", fontsize=16)
# 將指定的列的數據旋轉90度
plt.xticks(students[name], rotation=90, fontsize=16)
plt.tight_layout()
# 展示
plt.show()# 繪制折線圖 上方為柱狀圖
students.plot(y=[score, age])
plt.title("學生的分數")
plt.xticks(students.index)
plt.show()# 散點圖
students.plot.scatter(x=score, y=age)
plt.title("學生的分數年齡")
plt.ylabel("分數")
plt.xlabel("年齡")
plt.show()
輸出結果:
柱狀圖部分
折線圖部分
散點圖部分
8.讀寫word文檔
from docx import Document# 創建文件
document = Document()
document.save("new.docx")# 讀取文件
doc = Document("new.docx")
# 循環段落
for paragraph in doc.paragraphs:print(paragraph.text)# 將文字寫入到word文檔中
doc1 = Document()
# 添加標題
doc1.add_heading("一級標題", level=1)
# 添加段落
p2 = doc1.add_paragraph("第二個段落")
p1 = p2.insert_paragraph_before("第一個段落")
p3 = doc1.add_paragraph("新段落")
# 增加文字內容
p3.add_run("加粗").bold = True
p3.add_run("以及")
p3.add_run("斜體").italic = True
doc1.save("new1.docx")
輸出結果:
9.word寫入圖片
from docx import Document
from docx.shared import Inchesdoc = Document()
doc.add_picture("p.png", width=Inches(1.25))
doc.save("new2.docx")
10.word寫入表格
from docx import Document
from docx.shared import Inchesdoc = Document()
# 創建table 設置行列數量
table = doc.add_table(rows=3, cols=3)
# 設置table的樣式
table.style = "Table Grid"
# 獲取單元格
cell = table.cell(0, 1)
# 設置單元格文本
cell.text = "第一行第二列"
p = cell.paragraphs[0]
run = p.add_run()
run.add_picture("img.png", width=Inches(2))doc.save("new3.docx")
11.xlrd讀取excel表格數據
注意版本使用
import xlrd# xlrd新版本只支持讀取xls文件,讀取xlsx文件需要降為1.2.0版本
data = xlrd.open_workbook("test1.xlsx")
print(data)# 獲取第一個sheet頁 三種方法
sheet = data.sheets()[0]
sheet = data.sheet_by_index(0)
sheet = data.sheet_by_name("Sheet1")
print(sheet)