pythondataframe
⑴ python怎麼對dataframe進行操作
用pandas中的DataFrame時選取行或列:
import numpy as npimport pandas as pdfrom pandas import Sereis, DataFrameser = Series(np.arange(3.))data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz'))data['友李w'] #選擇表格中的'w'列,使用類字典屬性,返回的是Series類型data.w #選擇表格中的'w'列,使用點屬性,返回的是Series類型data[['w']] #選擇表格中的'w'列,返回的是DataFrame類型data[['w','z']] #選擇表格中的'w'、'z'列data[0:2] #返回第1行到第2行的所有行,前閉後開,包括前不包括後data[1:2] #返回第2行,從0計,返回的是單行,通過有前後值的索引形式,
#如果採用data[1]則報錯data.ix[1:2] #返回第2行的第三種方法,返回的是DataFrame,跟data[1:2]同data['a':'b'] #利用index值進行切片,返回的是**前閉後閉**的DataFrame,
#即末端是包含的
data.irow(0) #取data的第一行data.icol(0) #取data的第森昌一列data.head() #返回data的前幾行數據,默認為前五行,需要前十行則data.head(10)data.tail() #返回data的後幾行數據,默認為後五行,需要後十行則data.tail(10)ser.iget_value(0) #選取ser序列中的第一個ser.iget_value(-1) #選取ser序列中的最後一個,這種軸索引包含索引器的series不能採用ser[-1]去獲取最後一個,這會引起歧義。data.iloc[-1] #選取DataFrame最後一行,返回的是Seriesdata.iloc[-1:] #選取DataFrame最後一行,返回的是DataFramedata.loc['a',['w','x']] #返回『a』行'w'、'x'列,這種用於選取行索引列索引已知好春遲data.iat[1,1] #選取第二行第二列,用於已知行、列位置的選取。04142
下面是簡單的例子使用驗證:
import pandas as pdfrom pandas import Series, DataFrame
import numpy as np
data = DataFrame(np.arange(15).reshape(3,5),index=['one','two','three'],columns=['a','b','c','d','e'])
data
Out[7]:
a b c d eone 0 1 2 3 4two 5 6 7 8 9three 10 11 12 13 14#對列的操作方法有如下幾種data.icol(0) #選取第一列E:\Anaconda2\lib\site-packages\spyder\utils\ipython\start_kernel.py:1: FutureWarning: icol(i) is deprecated. Please use .iloc[:,i] # -*- coding: utf-8 -*-Out[35]:
one 0two 5three 10Name: a, dtype: int32
data['a']
Out[8]:
one 0two 5three 10Name: a, dtype: int32
data.aOut[9]:
one 0two 5three 10Name: a, dtype: int32
data[['a']]
Out[10]:
aone 0two 5three 10data.ix[:,[0,1,2]] #不知道列名只知道列的位置時Out[13]:
a b cone 0 1 2two 5 6 7three 10 11 12data.ix[1,[0]] #選擇第2行第1列的值Out[14]:
a 5Name: two, dtype: int32
data.ix[[1,2],[0]] #選擇第2,3行第1列的值Out[15]:
atwo 5three 10data.ix[1:3,[0,2]] #選擇第2-4行第1、3列的值Out[17]:
a ctwo 5 7three 10 12data.ix[1:2,2:4] #選擇第2-3行,3-5(不包括5)列的值Out[29]:
c dtwo 7 8data.ix[data.a>5,3]
Out[30]:
three 13Name: d, dtype: int32
data.ix[data.b>6,3:4] #選擇'b'列中大於6所在的行中的第4列,有點拗口Out[31]:
dthree 13data.ix[data.a>5,2:4] #選擇'a'列中大於5所在的行中的第3-5(不包括5)列Out[32]:
c dthree 12 13data.ix[data.a>5,[2,2,2]] #選擇'a'列中大於5所在的行中的第2列並重復3次Out[33]:
c c cthree 12 12 12#還可以行數或列數跟行名列名混著用data.ix[1:3,['a','e']]
Out[24]:
a etwo 5 9three 10 14data.ix['one':'two',[2,1]]
Out[25]:
c bone 2 1two 7 6data.ix[['one','three'],[2,2]]
Out[26]:
c cone 2 2three 12 12data.ix['one':'three',['a','c']]
Out[27]:
a cone 0 2two 5 7three 10 12data.ix[['one','one'],['a','e','d','d','d']]
Out[28]:
a e d d done 0 4 3 3 3one 0 4 3 3 3#對行的操作有如下幾種:data[1:2] #(不知道列索引時)選擇第2行,不能用data[1],可以用data.ix[1]Out[18]:
a b c d etwo 5 6 7 8 9data.irow(1) #選取第二行Out[36]:
a 5b 6c 7d 8e 9Name: two, dtype: int32
data.ix[1] #選擇第2行Out[20]:
a 5b 6c 7d 8e 9Name: two, dtype: int32
data['one':'two'] #當用已知的行索引時為前閉後閉區間,這點與切片稍有不同。Out[22]:
a b c d eone 0 1 2 3 4two 5 6 7 8 9data.ix[1:3] #選擇第2到4行,不包括第4行,即前閉後開區間。Out[23]:
a b c d etwo 5 6 7 8 9three 10 11 12 13 14data.ix[-1:] #取DataFrame中最後一行,返回的是DataFrame類型,**注意**這種取法是有使用條件的,只有當行索引不是數字索引時才可以使用,否則可以選用`data[-1:]`--返回DataFrame類型或`data.irow(-1)`--返回Series類型Out[11]:
a b c d ethree 10 11 12 13 14data[-1:] #跟上面一樣,取DataFrame中最後一行,返回的是DataFrame類型Out[12]:
a b c d ethree 10 11 12 13 14data.ix[-1] #取DataFrame中最後一行,返回的是Series類型,這個一樣,行索引不能是數字時才可以使用Out[13]:
a 10b 11c 12d 13e 14Name: three, dtype: int32
data.tail(1) #返回DataFrame中的最後一行data.head(1) #返回DataFrame中的第一行78179180181182183184185186
最近處理數據時發現當pd.read_csv()數據時有時候會有讀取到未命名的列,且該列也用不到,一般是索引列被換掉後導致的,有強迫症的看著難受,這時候dataframe.drop([columns,])是沒法處理的,怎麼辦呢,
最笨的方法是直接給列索引重命名:
data6
Unnamed: 0 high symbol timedate 2016-11-01 0 3317.4 IF1611 18:10:44.82016-11-01 1 3317.4 IF1611 06:01:04.52016-11-01 2 3317.4 IF1611 07:46:25.52016-11-01 3 3318.4 IF1611 09:30:04.02016-11-01 4 3321.8 IF1611 09:31:04.0data6.columns = list('abcd')
data6 a b c ddate 2016-11-01 0 3317.4 IF1611 18:10:44.82016-11-01 1 3317.4 IF1611 06:01:04.52016-11-01 2 3317.4 IF1611 07:46:25.52016-11-01 3 3318.4 IF1611 09:30:04.02016-11-01 4 3321.8 IF1611 09:31:04.
重新命名後就可以用dataframe.drop([columns])來刪除了,當然不用我這樣全部給列名替換掉了,可以只是改變未命名的那個列,然後刪除。不過這個用起來總是覺得有點low,有沒有更好的方法呢,有,可以不去刪除,直接:
data7 = data6.ix[:,1:]1
這樣既不改變原有數據,也達到了刪除神煩列,當然我這里時第0列刪除,可以根據實際選擇所在的列刪除之,至於這個原理,可以看下前面的對列的操作。
⑵ python對dataframe進行操作
建議參考一下dataframe文檔,裡面有相應的方法,不需要使用for循環遍歷,for循環遍歷會拖慢程序。對於dataframe中數據檢索可以使用下面的方法。
【全部】df.values
【name列的數據】df['name'].values
【loc檢索A列】df.loc['A']
【iloc進行行檢索】df.iloc[0]
【直接使用名字進行列檢索,但不適合行檢索】df['name']
第一步:准備一些數據運行效果展示
完美運行,不用操心索引+1的問題,也不用再創建一個DataFrame實例!
希望能夠採納!
⑶ python數據分析2:DataFrame對象
DataFrame對象:二維表數據結構,由行列數據組成的表格
常用index表示行,columns表示列
'''
語文 數學 英語
0 110 105 99
1 105 88 115
2 109 120 130
'''
# print(df.columns) # Index(['語文', '數學', '英語'], dtype='object')
# print(df.index) # Int64Index([0, 1, 2], dtype='int64')
# 遍歷DataFrame數據的每一列
'''
0 110
1 105
2 109
Name: 語文, dtype: int64
0 105
1 88
2 120
Name: 數學, dtype: int64
0 99
1 115
2 130
Name: 英語, dtype: int64
'''
1.創建一個DataFrame對象
pandas.DataFrame(data,index,columns,dtype,)
# data表示數據,可以是ndarray數組,series對象、列表、字典等
# index表示行標簽(索引)
# columns表示列標簽(索引)
# dtype每一列數據的數據類型
# 用於復制數據
# 返回值DataFrame
通過二維數組創建成績表
'''
語文 數學 英語
0 110 105 99
1 105 88 115
2 109 120 130
'''
2.通過字典創建DataFrame對象
value值只能是一維數組或單個的簡單數據類型
# 數組,則要求所有的數組長度一致
# 單個數據,每行都需要添加相同數據
'''
語文 數學 英語 班級
0 110 105 109 高一7班
1 105 88 120 高一7班
2 99 115 130 高一7班
'''
'''
【DataFrame屬性】
values 查看所有元素的值 df.values
dtypes 查看所有元素的類型 df.dtypes
index 查看所有行名、重命名行名 df.index df.index=[1,2,3]
columns 查看所有列名、重命名列名 df.columns df.columns=['語','數']
T 行列數據轉換 df.T
head 查看前n條數據,默認5條 df.head() df.head(10)
tail 查看後n條數據,默認5條 df.tail() df.tail(10)
shape 查看行數和列數,[0]表示行,[1]表示列 df.shape[0] df.shape[1]
info 查看索引,數據類型和內存信息 df.info
【DataFrame函數】
describe 查看每列的統計匯總信息,DataFrame類型 df.describe()
count 返回每一列中的非空值的個數 df.count()
sum 返回每一列和和,無法計算返回空值 df.sum()
max 返回每一列的最大值 df.max()
min 返回每一列的最小值 df.min()
argmax 返回最大值所在的自動索引位置 df.argmax()
argmin 返回最小值所在的自動索引位置 df.argmin()
idxmax 返回最大值所在的自定義索引位置 df.idxmax()
idxmin 返回最小值所在的自定義索引位置 df.idxmin()
mean 返回每一列的平均值 df.mean()
median 返回每一列的中位數 df.median()
var 返回每一列的方差 df.var()
std 返回每一列的標准差 df.std()
isnull 檢查df中的空值,空值為True,否則為False,返回布爾型數組 df.isnull()
notnull 檢查df中的空值,非空值為True,否則為False,返回布爾型數組 df.notnull()
中位數又稱中值,是指按順序排列的一組數據中居於中間位置的數
方差用於度量單個隨機變數的離散程序(不連續程度)
標准差是方差的算術平方根,反映數據集的離散程度
'''
3. 導入.xls或.xlsx文件
# pandas.read_excel(io,sheetname=0,header=0,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None,na_values=None,keep_defalut_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None,comment=None,skipfooter=0,conver_float=True,mangle_pe_cols=True,**kwds)
'''
io 字元串,xls或xlsx文件路徑或類文件對象
sheet_name:None、字元串、整數、字元串列表或整數列表,默認值為0
字元串用於工作表名稱;整數為索引,表示工作表位置
字元串列表或整數列表用於請求多個工作表,為None時則獲取所有的工作表
sheet_name = 0 第一個Sheet頁中的數據作為DataFrame對象
sheet_name = 1 第二個Sheet頁中的數據作為DataFrame對象
sheet_name = 'Sheet1' 名為Sheet1的Sheet頁中的數據作為DataFrame對象
sheet_name = [0,1,'Sheet3'] 第一個,第二個和名為Sheet3的Sheet頁中的數據作為DataFrame對象
header:指定作為列名的行,默認值為0,即取第一行的值為列名。或數據不包含列名,則為header=None
names:默認值為None,要使用的列名列表
index_col:指定列為索引列,默認值為None,索引0是DataFrame對象的行標簽
usecols:int、list或字元串,默認值為None
如為None,則解析所有列
如為int,則解析最後一列
如為list列表,則解析列號和列表的列
如為字元串,則表示以逗號分隔的Excel列字母和列范圍列表
squeeze:布爾值,默認為False,如果解析的數據只包含一列,則返回一個Series
dtype:列的數據類型名稱為字典,默認值為None
skiprows:省略指定行數的數據,從第一行開始
skipfooter:省略指定行數的數據,從尾部數的行開始
4.導入指定Sheet頁的數據
# sheet_name=0表示第一個sheet頁的數據,以此類推,如果不指定,則導入第一頁
5.指定行索引導入Excel數據
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''
# 導入第一列數據
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''