dataframe 對象的操作
一、DataFrame的創建
有多種方式可以創建DataFrame,下面舉例介紹。
例1: 通過list創建
復制代碼
>> import pandas as pd
>> df = pd.DataFrame([[1,2,3],[4,5,6]])
>> df
0 1 2
0 1 2 3
1 4 5 6
[2 rows x 3 columns]
復制代碼
上面代表,創建了一個2行3列的表格,創建時只指定了表格的內容(通過一個嵌套的list),沒有指定列名和索引。
我們可以指定列表和索引,如:
復制代碼
>> df = pd.DataFrame([[1,2,3],[4,5,6]],index=[‘row1‘,‘row2‘],columns=[‘c1‘,‘c2‘,‘c3‘])
>> df
c1 c2 c3
row1 1 2 3
row2 4 5 6
[2 rows x 3 columns]
復制代碼
可以看出,上面代碼通過index和 columns參數指定了索引和列名。
例2:創建例子
復制代碼
>> import numpy as np
>> dates = pd.date_range(‘20121001‘,periods=6)>> df = pd.DataFrame(np.random.randn(6,4) , index = dates,columns=list(‘abcd‘))
>> df
a b c d
2012-10-01 -0.236220 0.586985 0.784953 -0.507129
2012-10-02 -1.020807 -1.316997 -0.747997 1.909333
2012-10-03 0.085208 -0.281736 1.112287 1.572577
2012-10-04 0.008708 -0.925711 -0.615752 -1.183397
2012-10-05 1.158198 -1.393678 0.586624 0.2024992012-10-06 1.149878 -2.383863 1.646403 1.647935
[6 rows x 4 columns]
復制代碼
上面代碼創建的dates是個時間索引,np.random.randn 方法創建一個6行4列的隨機數矩陣。
最後的df使用 dates作為索引,使用np.random.randn 方法創建的矩陣作為內容,使用 list(‘abcd‘)作為列名。
二、 DataFrame的一些基本操作
1、獲取數據的行數
len(df)
或
len(df.index)
2、顯示索引、列和底層的numpy數據
復制代碼
>> df.index
<class ‘pandas.tseries.index.DatetimeIndex‘>
[2012-10-01, ..., 2012-10-06]
Length: 6, Freq: D, Timezone: None
>> df.columns
Index([u‘a‘, u‘b‘, u‘c‘, u‘d‘], dtype=‘object‘)
>> df.values
array([[-0.2362202 , 0.58698529, 0.78495289, -0.50712897],
[-1.02080723, -1.31699704, -0.74799734, 1.90933343],
[ 0.08520807, -0.28173589, 1.11228743, 1.57257716],
[ 0.00870768, -0.92571109, -0.6157519 , -1.18339719],
[ 1.15819829, -1.39367835, 0.586624 , 0.20249899],
[ 1.14987847, -2.38386297, 1.64640287, 1.64793523]])
復制代碼
說明,這個例子中的df使用的是上面創建的 DataFrame對象
3、顯示數據
df.head([n]) # 獲取df中的前n行數據,n不指定,則默認為5
df.tail([n]) # 獲取df中的後n行數據,n不指定,則默認為5
復制代碼
>> dates = pd.date_range(‘20121001‘,periods=100)
>>df = pd.DataFrame(np.random.randn(100,4) , index = dates,columns=list(‘abcd‘ ))
>> df.head()
a b c d
2012-10-01 -1.010746 0.176277 -0.838870 0.742626
2012-10-02 0.111174 0.182840 0.193215 1.517350
2012-10-03 -0.757385 1.137521 -0.247181 0.659187
2012-10-04 -1.157838 1.464957 -2.106226 1.160796
2012-10-05 0.141747 0.032917 0.647210 -0.861413
[5 rows x 4 columns]
>> df.tail()
a b c d
2013-01-04 -0.225416 -1.436526 -0.349813 -0.130948
2013-01-05 -1.544653 -0.214760 1.455662 0.050591
2013-01-06 0.582737 -0.646163 -1.763772 -1.463706
2013-01-07 -0.694467 0.710954 -2.227337 -0.257376
2013-01-08 0.282839 -1.100346 1.526374 1.658781
復制代碼
註意,head 和 tail 返回的是一個新的dataframe,與原來的無關
4、按照索引排序
newdf = df.sort_index(ascending=False,inplace=True)
ascending=False 參數指定按照索引值的以降序方式排序,默認是以升序排序。
inplace=True 指定為True時,表示會直接對df中的數據進行排序,函數返回值為None,newdf的值為None;
如果不設置為True(默認為false),則不會對df中數據進行修改,會返回一個新的df,這時newdf就有內容,是一個新的排序後的df。
5、添加數據(append方法)
append方法可以添加數據到一個dataframe中,註意append方法不會影響原來的dataframe,會返回一個新的dataframe。
語法:
DataFrame.append(otherData, ignore_index=False, verify_integrity=False)
其中otherData參數是要添加的新數據,支持多種格式。
ignore_index 參數默認值為False,如果為True,會對新生成的dataframe使用新的索引(自動產生),忽略原來數據的索引。
verify_integrity參數默認值為False,如果為True,當ignore_index為False時,會檢查添加的數據索引是否沖突,如果沖突,則會添加失敗。
舉例說明1:
復制代碼
dates = pd.date_range(‘20121001‘,periods=10)
df = pd.DataFrame(np.random.randn(10,4) , index = dates,columns=list(‘abcd‘))
dates1 = pd.date_range(‘20121001‘,periods=2)
df1 = pd.DataFrame(np.random.randn(2,4) , index = dates1,columns=list(‘abcd‘))
df.append(df1) # df1中的2行數據會加到df中,且新產生的df的各行的索引就是原來數據的索引
df.append(df1,ignore_index=True) # df1中的2行數據會加到df中,且新產生的df的索引會重新自動建立
df.append(df1,verify_integrity=True) #會報錯,因為df1的索引和df2的索引沖突了
復制代碼
說明,df1的列名必須和df一致,否則不是簡單的添加行。而是會添加列,再添加行。
舉例2:
復制代碼
>> df.append({‘a‘:10,‘b‘:11,‘c‘:12,‘d‘:13},ignore_index=True)
a b c d
0 -0.471061 -0.937725 -1.444073 0.640439
1 -0.732039 -1.617755 0.281875 1.179076
2 1.115559 0.136407 -2.225551 0.119433
3 0.695137 0.380088 -0.318689 -0.048248
4 1.483151 -0.124202 -0.722126 0.035601
5 0.326048 -0.139576 -0.172726 0.931670
6 0.858305 0.857661 -0.279078 0.583740
7 -0.041902 0.408085 -1.019313 0.005968
8 0.626730 0.143332 -0.404894 0.377950
9 -1.850168 0.430794 -0.534981 -0.738701
10 10.000000 11.000000 12.000000 13.000000
復制代碼
上面代碼是新產生的df會添加一行。這種操作,ignore_index參數值必須設置為True,否則會報錯。
舉例3:
復制代碼
>> df.append({‘e‘:10},ignore_index=True)
a b c d e
0 -0.471061 -0.937725 -1.444073 0.640439 NaN
1 -0.732039 -1.617755 0.281875 1.179076 NaN
2 1.115559 0.136407 -2.225551 0.119433 NaN
3 0.695137 0.380088 -0.318689 -0.048248 NaN
4 1.483151 -0.124202 -0.722126 0.035601 NaN
5 0.326048 -0.139576 -0.172726 0.931670 NaN
6 0.858305 0.857661 -0.279078 0.583740 NaN
7 -0.041902 0.408085 -1.019313 0.005968 NaN
8 0.626730 0.143332 -0.404894 0.377950 NaN
9 -1.850168 0.430794 -0.534981 -0.738701 NaN
10 NaN NaN NaN NaN 10
復制代碼
可以看出,如果插入的數據,指定的列名不存在,新產生的df不僅會增加行,還會增加列。
6、遍歷數據
示例代碼如下
for index,row in df.iterrows():
print index #獲取行的索引
print row.a #根據列名獲取字段
print row[0]#根據列的序號(從0開始)獲取字段
7、查找數據
創建如下的dataframe
dates = pd.date_range(‘20121001‘,periods=10)
df = pd.DataFrame(np.random.randn(10,4) , index = dates,columns=list(‘abcd‘))
可以有各種方式獲取df中的全部或部分數據
df[‘a‘] #按照列名獲取指定的列,返回的是一個Series,其中key是索引,value是該列對應的字段值
df[:2] #獲取前2行數據,效果等同 df[0:2],返回的是一個新的dataframe
df[2:5] #獲取第3行~5行 這3條記錄,返回的是一個新的dataframe
df.loc[‘20121009‘] #獲取指定索引的行,等同於 df.loc[‘2012-10-09‘],返回的是一個Series,其中key是列名,value是該列對應的字段值
df.iloc[3] #獲取指定序號的行,這裏是第4行
8、刪除數據
del df[‘a‘] #刪除dataframe中指定的列,這個是直接影響當前的dataframe,註意 del不是函數,是python中的內置語句,沒有返回值
df.drop([‘a‘],axis=1) #刪除指定的列,與上面的區別是不會影響原來的dataframe,dop方法會返回一個刪除了指定列的新的dataframe
說明,dop方法既可以刪除列,也可以刪除行,但上面創建的df無法被刪除行(?),下面這個例子可以刪除行
data = pd.DataFrame(np.arange(16).reshape((4, 4)),index=[‘Ohio‘, ‘Colorado‘, ‘Utah‘, ‘New York‘],columns=[‘one‘, ‘two‘, ‘three‘, ‘four‘])
data.drop([‘Colorado‘, ‘Ohio‘])
上面代碼中的dop方法刪除了指定索引的兩行,註意同刪除列一樣,drop方法不會影響原來的dataframe,會返回一個刪除後的新的dataframe
9、增加列
例子代碼如下
dates = pd.date_range(‘20121001‘,periods=10)
df = pd.DataFrame(np.random.randn(10,3) , index = dates,columns=list(‘abc‘))
df[‘d‘] = pd.Series(np.random.randn(10),index=df.index)
上面代碼先是創建了一個dataframe,然後通過df[‘d‘] 插入了一個新的列。如果指定的列名存在,會修改列的內容。
10、修改指定行或單元格數據
df.values[i][j]= xxx #其中i是行號,j是列號,都是從0開始
df.values[1]=12 # 會把一行中的所有列中的數據設置為同一個值,這裏的參數1是序號,這裏為第2行數據
df[‘a‘] = 12 #這樣會把指定列的所有數據都設置為同一個值,如這裏的12。註意,如果指定的列名不存在,會新增列
11、插入行
前面介紹的append方法是產生一個新的 dataframe,不會改變原來的dataframe。
那有沒有辦法直接在當前的frame中插入一行數據呢? 上面介紹的 df[列名] = xxx 是用來插入或修改列的信息。
dataframe 對象的操作