A. 在python中怎麼在一個原有的DataFrame中加一新的列名
dataframe是神馬?我只會json格式的數據轉dict類型123import jsonj = json.loads(\\'{"name":"123","Age":22}\\') print(j) ========你是指pandas里的dataframe嗎?傳入dict參數實例化一下就行了
B. Python 數據處理(三十五)—— 文本數據處理
在 pandas 中,存儲文本主要有兩種方式
但一般建議使用 StringDtype 類型存儲文本數據。都是由於各種原因,現在字元串數據的默認存儲類型還是 object 。
要存儲為 string 類型,需要顯式的設置 dtype 參數
或者在創建 Series 或 DataFrame 之後,使用 astype 轉換類型
也可以使用 StringDtype/"string" 轉換其他非字元串類型的數據
轉換現有數據的類型
StringDtype 類型對象與 object 類型之間存在一些差異
兩個結果的輸出都是 Int64 類型。將其與 object 類型比較
當存在 NA 值時,輸出為 float64 。類似地,對於返回布爾值的方法
Series 和 Index 有一套字元串處理方法,可以方便地對數組的每個元素進行操作,最重要的是,這些方法會自動忽略缺失值。
這些方法可以通過 str 屬性訪問,通常具有與內置字元串方法相匹配的名稱
Index 上的字元串方法對於清理或轉換 DataFrame 的列特別有用。
例如,您可能有帶有前導或後置空格的列
因為 df.columns 是一個 Index 對象,所以我們可以使用 .str 訪問器
我們可以根據需要對列名進行處理,然後重新設置列名。
例如,我們刪除列名的前後空格,並將其改為小寫字母,同時用 _ 替換剩餘的空格
split 方法會返回一個值為 list 的 Series
可以使用 get 或 [] 訪問拆分後的列表中的元素
更簡單的方法是設置 expand 參數,返回一個 DataFrame
當原來的 Series 包含 StringDtype 類型的數據時,輸出列也將全部為 StringDtype
當然,也可以設置切割次數
它還有個對應的 rsplit 方法,從右邊起始對字元串進行拆分
replace 參數支持使用正則表達式,前兩個參數是 pat (匹配模式) 和 repl (替換字元串)
如果只是想要替換字元串字面值,可以將 regex 參數設置為 False ,而不需要對每個特殊字元進行轉義。此時 pat 和 repl 參數必須是字元串
此外, replace 方法還接受一個可調用的替換函數,會使用 re.sub() 方法在每個匹配的模式上調用該函數
該函數需要傳入一個正則對象作為位置參數,並返回一個字元串。例如
replace 方法的 pat 參數還接受 re.compile() 編譯的正則表達式對象。所有的 flags 需要在編譯正則對象時設置
如果在 replace 中設置 flags 參數,則會拋出異常
有幾種方法可以將一個 Series 或 Index 與自己或其他的 Series 或 Index 相連接,所有這些方法都是基於 cat() 方法
可以連接一個 Series 或 Index 的內容
如果未指定 sep 參數,則默認為空字元串
默認會跳過缺失值,也可以使用 na_rep 指定缺失值的表示方式
cat() 的第一個參數 others 可以是類似列表的對象,但是其長度需要和調用對象一致
只要兩個對象中存在缺失值,對應的結果中也是缺失值,除非指定了 na_rep
others 參數也可以是二維的,但是得保證其行數必須與調用的對象一致
對於 Series 或 DataFrame 的連接,可以通過設置 join 參數指定對齊方式
通常 join 可選范圍為: 'left' , 'outer' , 'inner' , 'right' 。此時,不再要求兩個對象長度一致
當 others 參數是 DataFrame 時,也可以使用
可以將一些類似數組的對象(如 Series , Index 等)放在一個類似列表的容器中,然後傳遞給 cat
對於沒有索引的對象,其長度必須與調用 cat 的對象相同。但是 Series 和 Index 可以是任意的,除非設置了 json=None 。
如果在 others 參數上包含不同索引的對象,且設置了 join='right' ,則最後的結果將會是這些索引的並集
C. python對dataframe列里的元素進行修改
直接在參數一欄設置一下即可:
df=pd.read_csv('text.csv', dtype={'編號':str}
這樣,把你要轉換的列的名字設定好, 「編號」列中的數據讀取為str
這樣,讀取到的數據就是按照我們的要求的了。
D. Python基礎命令都有什麼
(1)打開csv文件
import pandas as pd
df=pd.read_csv(r』data/data.csv』)
(2)dataframe index 重新排序
data=df.sort_index(axis=0,ascending=False)
(3)dataframe 按照某一列進行升序或者降序排列
data=df.sort([『date』],ascending=True升序,False降序)
(4)dataframe 的index重新從0開始
data=data.reset_index(drop=True)
(5)畫橫坐標是日期的圖
import matplotlib.pyplot as plt
x=data[『date』]#日期是字元串形式
y=data[『close price』]
plt.plot_date(x,y)
(6)求標准差
import numpy as np
np.std
(7)下取整
import math
math.floor
上取整:math.ceil
(8)希爾伯特變換
from scipy import fftpack
hx= fftpack.hilbert(price)
(9)值排序
data.order()
(10)差分
data.diff(1)#一階差分
dataframe 刪除元素
data.drop(元素位置)
(11)嵌套的array處理方法
import itertools
a = [[1,2,3],[4,5,6], [7], [8,9]]
out = list(itertools.chain.from_iterable(a))
(12)dataframe修改列名
data.columns=[『num』,』price』]
(13)excel表導入以後有空行解決辦法
import numpy as np
data= data.drop(data.loc[np.isnan(data.name.values)].index)
(15)diff用法
一.是dataframe或者series格式,直接就用data.diff()
二.是list格式,先轉換成轉換成list格式data=data.tolist() 然後dif=np.diff(data)
(16)dataframe中的日期type不是date格式,不能直接相加減,所以先轉換成list格式
t=data.time.tolist()
date_time = datetime.datetime.strptime(str(t),』%Y-%m-%d %H:%M:%S』)
date_time=datetime.date(date_time.year,date_time.month,date_time.day)
past= date_time - datetime.timedelta(days=n*365)
(17)符號化
np.sign
(18)字典的使用
label={『11』:』TP』,』1-1』:』FN』,』-11』:』FP』,』-1-1』:』TN』}
for i in range(len(data1)):
state=str(int(data1[i]))+str(int(data2[i]))
result.append(label[state])
(19)用plt畫圖的時候中文不顯示的解決辦法
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r」c:windowsontssimsun.ttc」, size=15)
plt.title(u』中文』, fontproperties=font_set)
(20)獲取當前程序運行的時間
from time import time
time1=time()
time2=time()
print(time2-time1)
以上是我找到的資料,對於我這個學習Python到半吊子的人來說也是要收藏起來的。
E. python 怎麼添加列名(表頭)
添加列名:
pd.read_csv(file, header=None, names = ['a','b','c'] )1
names為指定的名字
數據tab分隔的時候去讀方式
sep指定
df = pd.read_csv('../input/data_train.csv',sep = '\t',encoding='GBK')
F. 09.pandas修改列名、索引名字
有時候我們需要修改DataFrame的個別列名或者索引,避免重復、方便使用。
這時就需要使用到rename()函數,rename()函數使用時比較簡單。
源數據
現在我們想要把'表1Lat'和'表1Lon'改為維度和經度:
其中columns代表要對列名進行修改,在Python的pandas庫裡面,跟列名有關的一般都是用columns,而不是用names。在columns後面是一個字典形式,鍵是原列名,值是新列名。修改的時候只會改選擇到的列。注意修改只會要寫入源數據時需要賦值或者用inplace = True。
rename()函數適合於修改個別的索引或者列名,如果需要大部分的修改或者全部修改的話就使用set_index()函數比較方便。
多層索引或者列名怎麼修改?
G. Python其實很簡單 第二十一章 DataFrame數據處理
將Excel中的的數據讀入數據框架DataFrame後,可以非常方便的進行各種數據處理。
21.1 列間求和
求總分(總分=語文+數學+英語)
對於上一章所提到的學生成績表,僅用一個語句即可完成總分計算,並填充。
df['總分']=df['語文']+df['數學']+df['英語']
完整代碼如下:
from pandas import read_excel
file='d:/student.xlsx' #見第18章表18-1
df=read_excel(file,sheet_name=0,converters={'學號':str})
df['總分']=df['語文']+df['數學']+df['英語']
print(df.head()) #df.head()的作用是僅顯示5行記錄。
運行結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 248 NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 267 NaN
2 3 070103 李文博 NaN NaN 89 72 76 237 NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 267 NaN
4 5 070205 林若溪 NaN NaN 91 95 83 269 NaN
21.2替換
既可以將對滿足條件的行和列的數據替換,也可以對整個集合的數據按照條件進行替換。
df['總分'].replace(310,'x',inplace=True)
將總分列的數值「310」替換為「x」。inplace=True表示改變原數據。
df.replace(76,0,inplace=True)
將整個DataFrame中的數值「76」替換為「0」。
df.replace([98,76,99],0,inplace=True)
將整個DataFrame中的數值「98,76,99」一次替換為「0」。
21.2排序
既可以將某一列作為關鍵欄位排序,也可以將幾個列分別作為主、次關鍵欄位進行排序。排序既可以按升序排序,也可以按降序排序。
函數sort_values()的語法格式如下:
df.sort_values(by=[「col1」,」col2」,......,」coln」],ascending=False)
其中,coln表示列名,也可以是列名的列表;ascending表示排序方式,值為True表示升序,可以省缺,值為False表示降序。
如:
df=df.sort_values(by=['總分'],ascending=False)
表示按照「總分」從高到低排序。
df=df.sort_values(by=['總分','語文'],ascending=False)
表示按照「總分」從高到低排序,若「總分」相同,再按照「語文」成績從高到低排序。
21.3 欄位截取
函數slice()可以從某列中截取字元串。格式如下:
slice(start,stop)
其中,start表示開始位置;stop表示結束位置
例:
df['年級']=df['學號'].str.slice(0,2)
通過此語句可以截取學號欄位的第1、2個字元,並賦值給年級欄位。
21.4 記錄抽取
可以抽取滿足條件的記錄。
例:抽取總分>300的記錄。
df[df.總分>300]
抽取總分在300到310之間(包括300和310)的記錄。
df[df.總分.between(306,310)]
抽取學號中包含「0803」的記錄。這樣可以非常方便的抽取某個班的信息。
df[df.學號.str.contains(',na=False)]
此處的na=False,含義是如遇到NaN這樣的數據,直接做不匹配處理。
21.5修改記錄
1、整列替換
我們在前面已經給整列填充過數據,填充時原來的數據就被覆蓋了。
即如下語句:
df['總分']=df['語文']+df['數學']+df['英語']
2、個別修改
如將值『99』替換為值『100』,可用如下語句:
df.replace(ྟ',颼')
將指定列的值替,如將語文列和英語列的值『99』替換為值『100』,可用如下語句:
df.replace({'語文':99,'英語':99},100)
可用如下程序去驗證:
from pandas import read_excel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'學號':str})
print(df[(df.語文==99) |(df.英語==99)])
df=df.replace({'語文':99,'英語':99},100)
print(df[(df.語文==99) |(df.英語==99)])
運行結果為:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
28 29 090802 丁能通 09 NaN 119 120 99 338 NaN
29 30 090203 沈丹妮 09 NaN 109 108 99 316 NaN
Empty DataFrame
Columns: [序號, 學號, 姓名, 年級, 班級, 語文, 數學, 英語, 總分, 名次]
Index: []
可以看出,第一個print()語句輸出的結果中滿足條件「語文或英語為99分」的有兩條記錄,替換語句執行以後,df中再沒有滿足條件「語文或英語為99分」的記錄了。
21.6記錄合並
函數concat()的格式如下:
concat([dataFrame1,dataFrame2,......],ignore_index=True)
其中,dataFrame1等表示要合並的DataFrame數據集合;ignore_index=True表示合並之後的重新建立索引。其返回值也是DataFrame類型。
concat()函數和append()函數的功能非常相似。
例:
import pandas #導入pandas模塊
from pandas import read_excel #導入read_execel
file='d:/student.xlsx' #變數file表示文件路徑,注意'/'的用法 數據見第18章表18-1
df=read_excel(file,sheet_name=0,converters={'學號':str})
# 將Excel文件導入到DataFrame變數中
df=df[:5] #截取df的前5個記錄
print(df) #輸出df
df1=df[:3] #截取df的前3個記錄存入df1中
df2=df[3:5] #截取df的最後2個記錄存入df2中
df3=pandas.concat([df2,df1]) #將df2與df1合並存入df3中
print(df3) #輸出df3
運行結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
由於合並時是將df1合並到df2中,可以看出,索引仍然保持原來的狀態。
21.7統計次數
可以用如下方法統計出某個值在某行或者某個范圍出現的次數。
from pandas import read_excel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'學號':str})
df=df[:5]
print(df)
print(df['語文'].value_counts())
輸出結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陳冠濤 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
89 3
84 1
91 1
Name: 語文, dtype: int64
可以看出,通過value_counts()函數可以統計出列中各值出現的次數。
value_counts()函數的參數還有 :
ascending,當ascending=True時升序排列,當ascending=False時升序排列(此時該參數可省缺);
normalize,當normalize=True時,顯示的不再是各值出現的次數,而是佔比。
將上例中的語句print(df['語文'].value_counts())改為:
print(df['語文'].value_counts(ascending=True,normalize=True))
則輸出結果變成了:
91 0.2
84 0.2
89 0.6
Name: 語文, dtype: float64
21.8按值查找
print(df['語文'].isin([84,91]))
它的作用是查找『語文』列中值和isin所指的列表中元素一致的記錄,如果找到結果為True,否則為False。
輸出結果:
0 True
1 False
2 False
3 False
4 True
Name: 語文, dtype: bool
21.9數據分區
根據某個分區標准,將數據按照所屬區域進行劃分,並用相應的標簽表示,可以用cut()方法來實現。
語法格式如下:
cut(series, bins, right=True, labels=NULL)
其中:
series表示需要分組的數據;
bins表示分組的依據,是一個列表,其元素為劃分分區的邊界值,如[0,72,96,120],就是劃分3個分區,即0~72、72~96、96~120,默認的是「左包右不包」;
right表示分組時右邊是否閉合;
labels表示分組的自定義標簽,也可以不重新定義。
下面對上述學生成績表中的語文成績進行分組,並增加一個新的列「語文等級」。
import pandas as pd
from pandas import read_excel #導入read_execel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'學號':str})
df['年級']=df['學號'].str.slice(0,2)
df['班級']=df['學號'].str.slice(0,4)
df.總分=df.語文+df.數學+df.英語
bins=[0,72,96,max(df.語文)+1] #
lab=['不及格','及格','優秀']
grade=pd.cut(df.語文,bins,right=False,labels=lab)
df['語文等級']=grade
print(df.head())
print("語文成績分等級統計結果:")
print(df['語文等級'].value_counts())
運行結果如下:
序號 學號 姓名 年級 班級 語文 數學 英語 總分 語文等級
0 1 070101 王博宇 07 0701 84 71 93 248 及格
1 2 070102 陳冠濤 07 0701 89 89 89 267 及格
2 3 070103 李文博 07 0701 89 72 76 237 及格
3 4 070204 姜海燕 07 0702 89 89 89 267 及格
4 5 070205 林若溪 07 0702 91 95 83 269 及格
語文成績分等級統計結果:
及格 17
優秀 10
不及格 4
Name: 語文等級, dtype: int64
H. python pandas怎麼設置列名
首先是引入pandas和numpy,這是經常配合使用的兩個包,pandas依賴於numpy,引入以後我們可以直接使用np/pd來表示這個兩個模塊
先創建一個時間索引,所謂的索引(index)就是每一行數據的id,可以標識每一行的唯一值
為了快速入門,我們看一下如何創建一個6X4的數據:r
I. python對excel操作
Python對於Excel的操作是多種多樣的,掌握了相關用法就可以隨心所欲的操作數據了!
操作xls文件
xlrd(讀操作):
import xlrd
1、引入xlrd模塊
workbook=xlrd.open_workbook("36.xls")
2、打開[36.xls]文件,獲取excel文件的workbook(工作簿)對象
names=workbook.sheet_names()
3、獲取所有sheet的名字
worksheet=workbook.sheet_by_index(0)
4、通過sheet索引獲得sheet對象
worksheet為excel表第一個sheet表的實例化對象
worksheet=workbook.sheet_by_name("各省市")
5、通過sheet名獲得sheet對象
worksheet為excel表sheet名為【各省市】的實例化對象
nrows=worksheet.nrows
6、獲取該表的總行數
ncols=worksheet.ncols
7、獲取該表的總列數
row_data=worksheet.row_values(n)
8、獲取該表第n行的內容
col_data=worksheet.col_values(n)
9、獲取該表第n列的內容
cell_value=worksheet.cell_value(i,j)
10、獲取該表第i行第j列的單元格內容
xlwt(寫操作):
import xlwt
1、引入xlwt模塊
book=xlwt.Workbook(encoding="utf-8")
2、創建一個Workbook對象,相當於創建了一個Excel文件
sheet = book.add_sheet('test')
3、創建一個sheet對象,一個sheet對象對應Excel文件中的一張表格。
sheet.write(i, j, '各省市')
4、向sheet表的第i行第j列,寫入'各省市'
book.save('Data\\36.xls')
5、保存為Data目錄下【36.xls】文件
操作xlsx文件
openpyxl(讀操作):
import openpyxl
1、引入openpyxl模塊
workbook=openpyxl.load_workbook("36.xlsx")
2、打開[36.xlsx]文件,獲取excel文件的workbook(工作簿)對象
names=workbook.sheetnames
worksheet=workbook.worksheets[0]
worksheet=workbook["各省市"]
ws = workbook.active
6、獲取當前活躍的worksheet,默認就是第一個worksheet
nrows=worksheet.max_row
7、獲取該表的總行數
ncols=worksheet.max_column
8、獲取該表的總列數
content_A1= worksheet['A1'].value
9、獲取該表A1單元格的內容
content_A1=worksheet.cell(row=1,column=1).value
10、獲取該表第1列第1列的內容
openpyxl(寫操作):
workbook=openpyxl.Workbook()worksheet = workbook.active
3、獲取當前活躍的worksheet,默認就是第一個worksheet
worksheet.title="test"
4、worksheet的名稱設置為"test"
worksheet = workbook.create_sheet()
5、創建一個新的sheet表,默認插在工作簿末尾
worksheet.cell(i,j,'空')
6、第i行第j列的值改成'空'
worksheet["B2"]="空"
7、將B2的值改成'空'
worksheet.insert_cols(1)
8、在第一列之前插入一列
worksheet.append(["新增","台灣省"])
9、添加行
workbook.save("Data\\36.xlsx")
10、保存為Data目錄下【36.xlsx】文件
pandas處理excel文件
pandas操作:
import pandas as pd
1、引入pandas模塊
data = pd.read_excel('36.xls')
2、讀取[36.xls]或者[36.xlsx]文件
data = pd.read_csv('36.csv')
3、讀取[36.csv]文件
data=data.dropna(subset=['店鋪'])
4、過濾掉data店鋪列有缺失的數據
data.sort_values("客戶網名", inplace=True)
5、將data數據按照客戶網名列進行從小到大排序
data = pd.read_csv(36.csv, skiprows = [0,1,2],sep = None, skipfooter = 4)
6、讀取[36.csv]文件,前三行和後四行的數據略過
data = data.fillna('空')
7、將data中的空白處填充成'空'
data.drop_plicates('訂單','first',inplace=True)
8、data中的數據,按照【訂單】列做去重處理,保留第一條數據
data=pd.DataFrame(data,columns=['訂單','倉庫'])
9、只保留data中【訂單】【倉庫】列的數據
data = data[(data[u'展現量'] > 0)]
10、只保留【展現量】列中大於0的數據
data= data[data["訂單"].str.contains('000')]
11、只保留【訂單】列中包含'000'的數據
data= data[data["倉庫"]=='正品倉']
12、只保留【倉庫】列是'正品倉'的數據
xs= data[data["店鋪"]=='南極人']['銷售額']
13、獲取店鋪是南極人的銷售額數據
data['訂單'] = data['訂單'].str[3:7]
14、【訂單】列的值只保留4-8個位元組的值
data["郵資"] = np.where((data['店鋪'].str.contains('T|t')) & -(data['倉庫'] == '代發倉'), 8, data['郵資'])
15、滿足店鋪列包含 T 或 t 並且倉庫不等於'代發倉'的話,將郵資的值改成8,否則值不變
data = np.array(data).tolist()
16、將data從DataFrame轉換成列表
data=pd.DataFrame(data)
17、將列表轉換成DataFrame格式
zhan = data[u'展現'].sum().round(2)
18、將data中所有展現列數據求和,並取兩位小數
sum=data.groupby(['店鋪'])['刷單'].sum()
19、將data中按照店鋪對刷單進行求和
counts=data['店鋪'].value_counts()
20、將data按照店鋪進行計算
avg=data.groupby(['店鋪'])['刷單'].mean()
21、將data按照店鋪對刷單進行求平均數
count = pd.concat([counts,sum], axis=1, ignore_index=True, sort=True)
22、將counts和sum兩個DataFrame進行了組合
count=count.rename(index=str, columns={0: "訂單", 1: "成本"})
23、將新生成的DataFrame列名進行修改
data = pd.merge(sum, counts, how='left', left_on='店鋪', right_on='店鋪')
24、將列表轉換成DataFrame格式
from openpyxl import Workbook
wb=Workbook()
ws1=wb.active
data.to_excel('36.xlsx')
wb.close()
25、data完整的寫入到關閉過程,執行此操作的時候【36.xlsx】不能是打開狀態
excel格式操作
樣式處理:
1、打開【36.xlsx】
sheet=workbook.worksheets[0]
2、將第一個sheet對象賦值給sheet
sheet.column_dimensions['A'].width = 20.0
3、將A列的寬度設置為20
sheet.row_dismensions[1].height = 20.0
4、將第一行的行高設置為20
sheet.merge_cells('A1:A2')
5、將sheet表A1和A2單元格合並
sheet.unmerge_cells('A1:A2')
6、將sheet表A1和A2單元格取消合並
sheet.insert_rows(2,2)
7、將sheet表從第2行插入2行
sheet.insert_cols(3,2)
8、將sheet表從第3列插入2列
sheet.delete_rows(2)
9、刪除第2行
sheet.delete_cols(3, 2)
10、將sheet表從第3列開始刪除2列
from openpyxl.styles import Font, Border, PatternFill, colors, Alignment
11、分別引入字體、邊框、圖案填充、顏色、對齊方式
sheet.cell(i,j).font = Font(name='Times New Roman', size=14, bold=True, color=colors.WHITE)
12、設置sheet表第 i 行第 j 列的字體
sheet.cell(i,j).alignment = Alignment(horizontal='center', vertical='center')
13、設置sheet表第 i 行第 j 列的字體對齊方式
left, right, top, bottom = [Side(style='thin', color='000000')] * 4sheet.cell(i,j).border = Border(left=left, right=right, top=top, bottom=bottom)
14、引入邊框樣式並調用
fill = PatternFill("solid", fgColor="1874CD")sheet.cell(1,j).fill = fill
15、引入填充樣式,並調用
import xlrd
from openpyxl import Workbook
from openpyxl import load_workbook
workbook=load_workbook(filename='C:/Users/EDZ/Desktop/工作/2021.08.03/大兄弟.xlsx')
sheet=workbook.active
sheet.insert_cols(idx=1)
sheet.merge_cells(A1:A3)
sheet['A1']=['上海','山東','浙江']
J. Python其實很簡單 第十九章 Pandas之Series與DataFrame
19.1安裝Anaconda
Anaconda是Python的一個開源發行版本,它預裝了豐富的第三方庫,而且主要面向科學計算和數據分析,使用起來要比原版的Python更省時省力。
Anaconda官方下載網址為:https://www.continuum.io/downloads。下載和安裝的方法很簡單,若有問題可以在網上搜索相關內容學習解決。
安裝Anaconda之後,就會發現在Anaconda目錄下同時安裝了Jupyter Notebook、Spyder等工具,我們接下來主要使用Spyder進行開發。關於Spyder的使用方法非常簡單,大家也可以去網上搜索學習。
雖然Anaconda已經預裝了很多常用的包,但有時我們也需要自己安裝一些包。可以在開始菜單中選擇「Anaconda Anaconda Prompt」命令,在命令行輸入conda install ( 代表包名)即可安裝,也可以輸入pip install 。
19.2數據分析包Pandas
Pandas是Python的一個數據分析包,Anaconda安裝時已經附帶安裝了Pandas包。
Pandas數據結構有三種:Series(一維數組)、DataFrame(二維數組)和Panel(三維數組),其中最常用的是前兩種數據結構。
19.2.1 Series
Series(序列)用於存儲一行或一列數據,以及與之相關的索引的集合。
語法格式如下:
Series([數據1,數據2,......], index=[索引1,索引2,......])
例:
from pandas import Series
s=Series(['張三','李四','王五'],index=[1,2,3])
print(s)
輸出結果如下:
1 張三
2 李四
3 王五
dtype: object
上面建立序列時指定了索引,若不指定,則默認的索引值從0開始。如下:
s=Series(['張三','李四','王五'])
輸出結果為:
0 張三
1 李四
2 王五
dtype: object
索引值也可以為字元串。如下:
from pandas import Series
s=Series(['張三','李四','王五'],index=['A','B','C'])
print(s)
輸出結果為:
A 張三
B 李四
C 王五
dtype: object
1、訪問序列
(1)可以通過索引訪問序列,如:
from pandas import Series
s=Series(['張三','李四','王五'])
print(s)
print(s[0])
print(s[1:])
運行結果如下:
0 張三
1 李四
2 王五
dtype: object #print(s)輸出
張三 #print(s[0])輸出
1 李四
2 王五
dtype: object #print(s[1:])輸出
(2)通過值獲取索引值
from pandas import Series
s=Series(['張三','李四','王五'],index=['A','B','C'])
print(s.index[s.values=='李四'])
運行結果:
Index(['B'], dtype='object')
(3)判斷值是否存在
from pandas import Series
s=Series(['張三','李四','王五'],index=['A','B','C'])
f='李四' in s.values
print(f)
運行結果:
True
(4)定位獲取
from pandas import Series
s=Series(['張三','李四','王五','孫六'],index=['A','B','C','D'])
print(s[[0,2,1]])
運行結果:
A 張三
C 王五
B 李四
dtype: object
2、修改序列
(1)追加序列,如:
from pandas import Series
s=Series(['張三','李四','王五'],index=['A','B','C'])
s1=Series(['孫六'],index=['D'])
s=s.append(s1)
print(s)
運行結果:
A 張三
B 李四
C 王五
D 孫六
dtype: object
(2)修改序列的值
from pandas import Series
s=Series(['張三','李四','王五','孫六'],index=['A','B','C','D'])
s[1]='李飛'
print(s)
運行結果:
A 張三
B 李飛
C 王五
D 孫六
dtype: object
不知道索引,僅知道要修改的值,也可通過值查找到索引後,再修改序列的值。如:
s[s.index[s.values=='李四']]='李飛'
這樣也可以將「李四」修改為「李飛。
(3)修改索引
from pandas import Series
s=Series(['張三','李四','王五','孫六'],index=['A','B','C','D'])
s.index=[0,1,2,3]
print(s)
運行結果:
0 張三
1 李四
2 王五
3 孫六
dtype: object
(4)刪除元素
from pandas import Series
s=Series(['張三','李四','王五','孫六'],index=['A','B','C','D'])
s=s.drop('A')
print(s)
運行結果:
B 李四
C 王五
D 孫六
dtype: object
(5)重新排序
可以按照索引排序,使用sort_index(ascending=True)方法對index進行排序操作。
from pandas import Series
s=Series(['張三','李四','王五','孫六'],index=['A','B','C','D'])
s=s.sort_index(ascending=False) # ascending=False表示按降序排列
print(s)
運行結果:
D 孫六
C 王五
B 李四
A 張三
dtype: object
(6)重置索引
重置索引可以使用reindex()。如果index列表中的元素多於序列的值,可用fill_value=0這樣的語句填充。
s=s.reindex(['D','C','B','A'])
如果index列表中的元素多於序列的值,可用fill_value=0這樣的語句填充。
s=s.reindex(['D','C','B','A'], fill_value=0)
19.2.2 DataFrame
DataFrame(數據框架)用於存儲多行和多列的數據集合。它是Series的容器,類似於Excel中二維表格。
定義一個DataFrame的語法格式如下:
df=DataFrame({列名1 : 序列1,列名2 : 序列2,.......列名n : 序列n}, index=序列 )
例如,有如下二維表:
姓名
性別
年齡
張三
男
18
李四
女
19
王五
男
17
保存到DataFrame中可以用如下方法:
from pandas import Series
from pandas import DataFrame
name=Series(['張三','李四','王五'])
sex=Series(['男','女','男'])
age=Series([18,19,17])
df=DataFrame({'姓名':name,'性別':sex,'年齡':age})
print(df)
運行結果:
姓名 性別 年齡
0 張三 男 18
1 李四 女 19
2 王五 男 17
從上例可以看出,雖然我們省缺了索引,但系統自動添加了從0開始的索引值。
19.3 DataFrame的基本操作
1、訪問方式
(1)獲取行
print(df[1:2]) # 獲取第1行的值
輸出結果:
姓名 性別 年齡
1 李四 女 19
print(df[1:3]) #獲取第1行到第2行的值
輸出結果:
姓名 性別 年齡
1 李四 女 19
2 王五 男 17
(2)獲取列
print(df['姓名']) #獲取「姓名」列的值
輸出結果:
0 張三
1 李四
2 王五
Name: 姓名, dtype: object
另一種方法:
print(df[df.columns[0:1]]) #先按照索引號獲取列名,再按照列名讀取
輸出結果和上面的方法完全一致。
還有一種情況,是獲取唯一值,即將列內的重復值中多餘的刪除,僅留下互不相同的值。所用的到方法是unique()。
sex1=Series(df['性別'].unique())
print(sex1)
輸出結果:
0 男
1 女
dtype: object
(3)獲取指定位置的值
print(df.at[1,'姓名']) # 格式為變數名.at[行號,列名]
輸出結果:
李四
(4)獲取塊的值
print(df.iloc[0:2,1:3]) # 格式為變數名.iloc[行號1:行號2, 列號1:列號2]
輸出結果:
性別 年齡
0 男 18
1 女 19
print(df.iloc[:,1:2]) #獲取「性別」列的值
運行結果:
性別
0 男
1 女
2 男
2、修改、刪除、增加行和列
(1)修改列名
print(df.columns)
df.columns=['name','sex','age']
print(df.columns)
輸出結果:
Index(['姓名', '性別', '年齡'], dtype='object')
Index(['name', 'sex', 'age'], dtype='object')
可見,列名已經由「姓名、性別、年齡」修改為「age、sex、age」了。但這種修改必須把全部列名都一一列舉,不能有遺漏,否則就會出錯。如:
df.columns=['name','sex']
此時會報錯:ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements。
(2)修改行索引
df.index=[1,2,3]
(3)刪除行
df.drop(1,axis=0) # axis=0表示行軸,也可以省略
(4)刪除列
df.drop(『性別』,axis=1) # axis=0表示列軸
也可以使用另一種方法:
del df['性別']
(5)增加列
df['電話']=[',',']
print(df)
運行結果:
姓名 性別 年齡 電話
0 張三 男 18 1111111
1 李四 女 19 2222222
2 王五 男 17 3333333
(6)增加行
df.loc[len(df)]=['孫六','男',ཐ']
(7)追加
from pandas import Series
from pandas import DataFrame
name=Series(['張三','李四','王五'])
sex=Series(['男','女','男'])
age=Series([18,19,17])
df=DataFrame({'姓名':name,'性別':sex,'年齡':age}) # 建立DataFrame,變數名為df
name1=Series(['孫六','候七'])
sex1=Series(['男','女'])
age1=Series([19,17])
df1=DataFrame({'姓名':name1,'性別':sex1,'年齡':age1})
# 建立DataFrame,變數名為df1
df=df.append(df1,ignore_index=True)
# 將對df1追加到df後面,參數ignore_index=True表示重新索引
print(df)
運行結果:
姓名 性別 年齡
0 張三 男 18
1 李四 女 19
2 王五 男 17
3 孫六 男 19
4 候七 女 17