1. 程式人生 > 其它 >pandas 批量修改列名_Pandas增刪改查的詳細總結

pandas 批量修改列名_Pandas增刪改查的詳細總結

技術標籤:pandas 批量修改列名

Numpy和Pandas是Python進行資料分析的基礎庫,當初學習Pandas就買了《利用Python進行資料分析》這本書來看,書非常棒,既深入又通俗,而且這本書的原作者就是Pandas庫的主要建立者之一。Pandas最常用的兩種資料結構是Series和DataFrame,Series是一維資料,類似一維陣列,DataFrame是二維資料,類似Excel表格,這兩種資料結構都包含資料標籤index,在沒有設定index時,系統會自動分配(0到N-1)。本文使用Jupyter notebook進行程式設計測試。

建立/讀取Series和DataFrame資料

import pandas as pd
import numpy as np
#建立資料
data_series = pd.Series([1,2,3,4])    #列表生成Series
data_pd = pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8]})  #可用包含等長列表(陣列/Series)的字典生成DataFrame
#設定索引
data_series = pd.Series([1,2,3,4],index=['a','b','c','d'])    #列表生成Series
data_pd = pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8]},index=['a','b','c','d'])
#分別檢視值和索引
print(data_series.index)
print(data_pd.index)
print(data_series.values)   #一維陣列
print(data_pd.values)       #二維陣列


#讀取其他資料檔案
df_excel = pd.read_excel('file.xlsx',sheet_name='Sheet1') #讀入excel檔案
df_csv = pd.read_csv('file.csv')  #讀入csv檔案
df_json = pd.read_json('file.json')

#輸出資料檔案
df.to_csv('save_file.csv')
df.to_excel('save_file.xlsx')
df.to_json('save_file.json')

c755d8f7bfd8c8311ca201202681382c.png
左:Series,右:DataFrame

27b6bc1935259942b343042476665a3f.png
設定索引

41a44dc7013bf308189db1961f252542.png
索引和值

索引物件

Pandas的索引物件用來儲存軸標籤(包括行索引和列索引),索引物件不可以修改,類似於陣列和集合,與集合不同的是索引可以重複。

#輸出DataFrame的索引物件
print('data_pd.columns: ',data_pd.columns)
print('data_pd.index: ',data_pd.index)

#生成索引物件
index = pd.Index(np.arange(3))

#判斷元素是否存在索引中
1 in index   #返回True
4 in index   #返回False

#重置索引reindex
data_pd.reindex(['a','c','b','d','h','f'])  #資料按照新索引進行排列,如果索引不存在為NaN
data_pd.reindex(columns = ['col3','col2','col1'])  #重置列索引

88214500221a456d4ae9afda962ba9be.png
索引物件

查詢資料

#查詢列資料
data_pd['col1']  #查詢一列
data_pd[['col1','col2']]  #查詢多列

#切片查詢資料
data_pd[:2]  #得到前2行的資料

#利用索引符號loc查詢資料(軸標籤)
data_pd.loc['c']        #查詢c行
data_pd.loc['c','col2'] #可傳入兩個引數,行標籤和列標籤,查詢c行col2列的資料
data_pd.loc[['c','d'],'col2'] #標籤可傳入列表作為引數選擇多列多行
data_pd.loc[:'c','col2']  #loc可進行切片選擇行列

#利用索引符號iloc查詢資料(整數標籤)
data_pd.iloc[2]        #查詢第3行,c行
data_pd.ioc[2,1] #可傳入兩個引數,行整數標籤和列整數標籤,查詢第3行第2列的資料
data_pd.iloc[[2,3],1] #標籤可傳入多個整數選擇多列多行
data_pd.iloc[:2,1]  #iloc可進行切片選擇行列

#按條件查詢資料
data_pd[data_pd['col1']>2]   #查詢col1大於2的資料
data_pd[data_pd<2] = 0  #將資料中小於2的都賦值為0

#多條件查詢,&連線條件,選col1列大於2,col2列小於8的資料
data_new = data_pd[(data_pd['col1']>2)&(data_pd['col2']<8)]

017da10e332d6eef927036859d09802c.png
左:查詢一列,右:查詢c行

修改資料

#插入新行
data_pd['new_col1'] = 5    #生成一行標量5
data_pd['new_col2'] = np.arange(4)   #生成一行從0到3

#修改列名 rename函式
data_pd.rename(columns = {oldname1 : newname1,oldname2 : newname2,})  #傳入欄位修改
data_pd.renam(columns = lambda x : x.replace("col",""))  #傳入lambda函式批量修改

#按條件修改資料
data.loc[data['order_mark'].isnull(),'order_seq'] = np.nan

將陣列和列表賦值給data_frame時,長度必須一致,而將series賦值給data_frame的一列會按照索引重新排列,不匹配的索引則為缺失值NaN。

刪除資料

#刪除列del,直接在原資料上刪除
del data_pd['new_col1']

#軸向上刪除用drop,drop函式會返回一個新物件,如果要修改原資料可加上引數inplace = True
data_pd.drop('c')    #刪除c行
data_pd.drop(['col1','new_col2'],axis=1)  #利用axis = 1 或者axis = 'columns'
data_pd.drop(['col1','new_col2'],axis=1,inplace=True) #在原資料上刪除

bc340495be5c42fa736b1c298c8e1fda.png
左邊:生成兩列,右邊:刪除new_col1

資料排序

對DataFrame資料排序,既可以按照行列標籤排序,也可以按照值進行排序,函式分別是sort_index和sort_values,排序後會生成排完序的新物件,而不是改變原來的資料。

#建立新data
data_pd2 = pd.DataFrame({'two':[1,5,7,4],'one':[3,5,7,8]},index=['b','a','d','c'])
#排序
data_pd2.sort_index()  #按標籤引排序
data_pd2.sort_index(axis=1)  #按列標籤排序
data_pd2.sort_values('one')
data_pd2.sort_values(by=['one','two'])   #還可傳入列表序列進行多個欄位排序
data_pd2.sort_values(['one','two'],ascending=False)  #預設升序,加上Ascending=False降序

1f84d894bee54cc8eddc8fd02f7fcfe8.png
從左到右:原資料,按行標籤排序,按列標籤排序,按列值排序

用rank()函式可對dataframe和series進行排名,pandas預設相同值取平均序號,可以傳入引數更改。

#排序
data_pd2.rank()  #每列資料按照從小到大得到序號
data_pd2.rank(axis=1) #可按列對每行資料進行排序

ddc8e114358975aa56d86d43c7cb3075.png
左:每列資料排序,右:每行資料資料排序

資料連線

Pandas連線資料主要是通過merge()函式和concat()函式,merge()函式的連線類似於sql資料庫中的join,而concat是在軸向上進行連線

#merge連線
pd.merge(df1,df2,on='key',how='left') #on表示連線列,how選擇連線方式
pd.merge(df1,df2,left_on='lkey',right_on='rkey',how='left') #當連線列名不同分別指定

#concat
pd.concat([s1,s2])  #縱向連線,當s1和s2索引不重疊時,可以直接拼接,相當於sql中的union

pd.concat([s1,s2],axis = 1)  #橫向連線,預設外連線,以行索引為連線欄位

常用統計方法

#統計某一列值的頻率
data_pd['columns'].value_counts()