DataFrame是一個【表格型】的數據結構,可以看做是【由Series組成的字典】(共用同一個索引)。DataFrame由按一定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。
行索引:index
列索引:columns
值:values(numpy的二維數組)
1)DataFrame的創建
最常用的方法是傳遞一個字典來創建。DataFrame以字典的鍵作爲每一【列】的名稱,以字典的值(一個數組)作爲每一列。
此外,DataFrame會自動加上每一行的索引(和Series一樣)。
同Series一樣,若傳入的列與字典的鍵不匹配,則相應的值爲NaN。
data={'color':['blue','green','yellow','red','white'],
'object':['ball','pen','pencil','paper','mug'],
'price':[1.2,1.0,0.6,0.9,1.7]}
frame=DataFrame(data,columns=['color','object','price','weight'],
index=['one','two','three','four','five'])
frame
frame.values
frame.columns
frame.index
frame.shape
練習4:
根據以下考試成績表,創建一個DataFrame,命名爲ddd:
張三 李四
語文 150 0
數學 150 0
英語 150 0
理綜 300 0
dic={'張三':[1500,150,150,300],'李四':[0,0,0,0]}
ddd=DataFrame(dic,index=['語文','數學','英語','理綜'])
ddd
2)DataFrame的索引
(1) 對列進行索引
- 通過類似字典的方式
- 通過屬性的方式
可以將DataFrame的列獲取爲一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經設置好了,就是相應的列名。
ddd['張三']#ddd.張三
語文 1500
數學 150
英語 150
理綜 300
Name: 張三, dtype: int64
(2) 對行進行索引
- 使用.ix[]來進行行索引
- 使用.loc[]加index來進行行索引
- 使用.iloc[]加整數來進行行索引
同樣返回一個Series,index爲原來的columns
ddd.iloc[1]#ddd.loc['數學']#ddd.ix['數學']
張三 150
李四 0
Name: 數學, dtype: int64
(3) 對元素索引的方法
- 先使用列索引
- 先使用行索引
- 使用values屬性(二維numpy數組)
print("使用列索引")
print(ddd.張三['語文']) #先列再行
print(ddd.ix['語文']['張三'])#先行再列
print(ddd.iloc[0][0]) #使用隱式索引
【注意】 直接用中括號時:
索引表示的是列索引
切片表示的是行切片
3)DataFrame的運算
(1) DataFrame之間的運算
同Series一樣:
在運算中自動對齊不同索引的數據
如果索引不對應,則補NaN
A=DataFrame(np.random.randint(0,10,(3,3)),columns=list('abc'))
B=DataFrame(np.random.randint(0,10,(2,2)),columns=list('ab'))
A.add(B,fill_value=0)
(2) Series與DataFrame之間的運算
【重要】
使用Python操作符:以行爲單位操作(參數必須是行),對所有行都有效。(類似於numpy中二維數組與一維數組的運算,但可能出現NaN)
使用pandas操作函數:
axis=0:以列爲單位操作(參數必須是列),對所有列都有效。
axis=1:以行爲單位操作(參數必須是行),對所有列都有效。
C.sub(C['a'],axis=0)
a b c
0 0.0 0.0
-16.0
1 0.0 1.0
-4.0
2 0.0 4.0
-1.0
============================================
練習6:
1:假設ddd是期中考試成績,ddd2是期末考試成績,請自由創建ddd2,並將其與ddd相加,求期中期末平均值。
2:假設張三期中考試數學被發現作弊,要記爲0分,如何實現?
3:李四因爲舉報張三作弊立功,期中考試所有科目加100分,如何實現?
4:後來老師發現有一道題出錯了,爲了安撫學生情緒,給每位學生每個科目都加10分,如何實現?
1:data2 = {'張三':[110,140,130,289],
'李四':[80,90,60,180]}
ddd = pd.DataFrame(data2,index=['語文','數學','英語','理綜'])
ddd
data3 = {"張三":[120,130,140,299],
'李四':[60,70,80,150]}
ddd2 = pd.DataFrame(data3,index=['語文','數學','英語','理綜'])
ddd2
ddd1 = ddd.add(ddd2)
ddd1
ddd1.div(2)
2:print('張三期中考試作弊,成績爲0')
ddd['張三']['數學']=0
ddd
3:print('李四檢舉有功,加100')
ddd['李四'] += 100
ddd
4:print('老師出錯題目,每位同學加10分')
ddd2+=10
ddd2