導航:首頁 > 編程語言 > pythondataframe新加一列

pythondataframe新加一列

發布時間:2024-05-05 03:56:03

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

② python的dataframe中兩列日期相減,怎麼計算間隔的天數,並寫入到dataframe中作為一個新列

a=pd.read('****')#loadcsv
b=pd.DataFrame(a)
b['time_interval']=pd.to_datetime(b['xxx'])-pd.to_datetime(b['xxx'])

③ Python—padas(DataFrame)的常用操作

我們先說一下DataFrame是什麼:

1、DataFrame是一種數據框結構,相當於是一個矩陣形式,單元格可以存放數值、字元串等,這和excel表很像;

2、DataFrame是有 行(index)和 列(columns)可以設置的;

有了示例,我們就能明白創建時需要傳入數據,指定index(行索引名)和columns(列名);

在我們需要將單個元素的字典直接轉為DataFrame時,程序會報錯,需要適當做些轉換,指定行索引或者列索引才行;

在增加列的時候我們用到了一個索引loc,後面我們再詳細對loc進行說明,此處先知道可以這樣使用。

文本字元串數據處理之前,一定要先轉為字元(.str)再進行處理

loc 和 iloc如果容易記混,你就取巧記憶,index是索引

所以iloc則是依據位置索引進行取數,沒有i的則是按照名稱進行提取數據

原諒我很懶,比較喜歡這樣框架式的筆記,所以文字就會比較少(#^.^#)!!!

閱讀全文

與pythondataframe新加一列相關的資料

熱點內容
plc和單片機哪個好 瀏覽:535
帝國神話組建雲伺服器 瀏覽:827
鄧散木pdf 瀏覽:199
方舟怎麼直連伺服器圖片教程 瀏覽:563
假相pdf 瀏覽:336
找對象找程序員怎麼找 瀏覽:976
怎麼投訴蘋果商店app 瀏覽:470
華為手機如何看有多少個app 瀏覽:734
btr如何管理別的伺服器 瀏覽:410
spwm軟體演算法 瀏覽:184
70多歲單身程序員 瀏覽:221
高考考前解壓拓展訓練 瀏覽:217
用紙做解壓玩具不用澆水 瀏覽:584
谷輪壓縮機序列號 瀏覽:737
牛頓插值法編程 瀏覽:366
php多用戶留言系統 瀏覽:731
安卓和蘋果如何切換流量 瀏覽:703
怎麼知道dns伺服器是多少 瀏覽:976
5995用什麼簡便演算法脫式計算 瀏覽:918
電腦上如何上小米雲伺服器地址 瀏覽:921