標題# dataframe格式知識點總結
1、DataFrame的創建
DataFrame是一種表格型資料結構,它含有一組有序的列,每列可以是不同的值,DataFrame既有行索引,也有列索引,它可以看作是由Series組成的字典,不過這些Series公用一個索引,
DataFrame的創建有多種方式,不過最重要的還是根據dict進行創建,以及讀取csv或者txt檔案來創建,這里主要介紹這兩種方式,
參考鏈接:https://www.jianshu.com/p/8024ceef4fe2
根據字典創建
import pandas as pd
data = {
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]
}
dataframe1 = pd.DataFrame(data)
print('創建的dataframe1如下:\n',dataframe1)
創建的dataframe1如下:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
DataFrame的行索引是index,列索引是columns,我們可以在創建DataFrame時指定索引的值:
dataframe2 = pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt'])
print('創建的dataframe2如下:\n',dataframe2)
創建的dataframe2如下:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
使用嵌套字典也可以創建DataFrame,此時外層字典的鍵作為列,內層鍵則作為索引:
pop = {'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame3 = pd.DataFrame(pop)
frame3
| Nevada | Ohio | |
|---|---|---|
| 2001 | 2.4 | 1.7 |
| 2002 | 2.9 | 3.6 |
| 2000 | NaN | 1.5 |
我們可以用index,columns,values來訪問DataFrame的行索引,列索引以及資料值,資料值回傳的是一個二維的ndarray
frame3.values
array([[2.4, 1.7],
[2.9, 3.6],
[nan, 1.5]])
frame3.Nevada
2001 2.4
2002 2.9
2000 NaN
Name: Nevada, dtype: float64
2.讀取檔案
讀取檔案生成DataFrame最常用的是read_csv,read_table方法,該方法中幾個重要的引數如下所示:
| 引數 | 描述 |
|---|---|
| header | 默認第一行為columns,如果指定header=None,則表明沒有索引行,第一行就是資料 |
| index_col | 默認作為索引的為第一列,可以設為index_col為-1,表明沒有索引列 |
| nrows | 表明讀取的行數 |
| sep或delimiter | 分隔符,read_csv默認是逗號,而read_table默認是制表符 |
| encoding | 編碼格式 |
其他創建DataFrame的方式有很多,比如我們可以通過讀取mysql或者mongoDB來生成,也可以讀取json檔案等等,這里就不再介紹,
3.DataFrame軸的概念
在DataFrame的處理中經常會遇到軸的概念,這里先給大家一個直觀的印象,我們所說的axis=0即表示沿著每一列或行標簽\索引值向下執行方法,axis=1即
表示沿著每一行或者列標簽模向執行對應的方法,
4.DataFrame一些性質
索引、切片
我們可以根據列名來選取一列,回傳一個Series:
frame3['Nevada']
2001 2.4
2002 2.9
2000 NaN
Name: Nevada, dtype: float64
我們還可以選取多列或者多行:
import numpy as np
data = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
#取列
data[['two','three']]
| two | three | |
|---|---|---|
| Ohio | 1 | 2 |
| Colorado | 5 | 6 |
| Utah | 9 | 10 |
| New York | 13 | 14 |
#取行
data[:2]
| one | two | three | four | |
|---|---|---|---|---|
| Ohio | 0 | 1 | 2 | 3 |
| Colorado | 4 | 5 | 6 | 7 |
#取特定的行和列
data[['two','three']][:2]
| two | three | |
|---|---|---|
| Ohio | 1 | 2 |
| Colorado | 5 | 6 |
當然,在選取資料的時候,我們還可以根據邏輯條件來選取:
#用于篩選特定的資料
data[data['three']>5]
| one | two | three | four | |
|---|---|---|---|---|
| Colorado | 4 | 5 | 6 | 7 |
| Utah | 8 | 9 | 10 | 11 |
| New York | 12 | 13 | 14 | 15 |
pandas提供了專門的用于索引DataFrame的方法,即使用ix方法進行索引,不過ix在最新的版本中已經被廢棄了,如果要是用標簽,最好使用loc方法,如果使用下標,最好使用iloc方法:
data
| one | two | three | four | |
|---|---|---|---|---|
| Ohio | 0 | 1 | 2 | 3 |
| Colorado | 4 | 5 | 6 | 7 |
| Utah | 8 | 9 | 10 | 11 |
| New York | 12 | 13 | 14 | 15 |
data.loc['Colorado',['two','three']]
two 5
three 6
Name: Colorado, dtype: int32
data.iloc[0:3,2]
Ohio 2
Colorado 6
Utah 10
Name: three, dtype: int32
type(data.iloc[0:3,2])
pandas.core.series.Series
修改資料
可以使用一個標量修改DataFrame中的某一列,此時這個標量會廣播到DataFrame的每一行上
data = {
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]
}
frame2 = pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt'])
frame2
frame2['debt']=16.5
frame2
| year | state | pop | debt | |
|---|---|---|---|---|
| one | 2000 | Ohio | 1.5 | 16.5 |
| two | 2001 | Ohio | 1.7 | 16.5 |
| three | 2002 | Ohio | 3.6 | 16.5 |
| four | 2001 | Nevada | 2.4 | 16.5 |
| five | 2002 | Nevada | 2.9 | 16.5 |
也可以使用一個串列來修改,不過要保證串列的長度與DataFrame長度相同:
frame2.debt = np.arange(5)
frame2
| year | state | pop | debt | |
|---|---|---|---|---|
| one | 2000 | Ohio | 1.5 | 0 |
| two | 2001 | Ohio | 1.7 | 1 |
| three | 2002 | Ohio | 3.6 | 2 |
| four | 2001 | Nevada | 2.4 | 3 |
| five | 2002 | Nevada | 2.9 | 4 |
可以使用一個Series,此時會根據索引進行精確匹配:
val = pd.Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt'] = val
frame2
| year | state | pop | debt | |
|---|---|---|---|---|
| one | 2000 | Ohio | 1.5 | NaN |
| two | 2001 | Ohio | 1.7 | -1.2 |
| three | 2002 | Ohio | 3.6 | NaN |
| four | 2001 | Nevada | 2.4 | -1.5 |
| five | 2002 | Nevada | 2.9 | -1.7 |
重新索引
使用reindex方法對DataFrame進行重新索引,對DataFrame進行重新索引,可以重新索引行,列或者兩個都修改,如果只傳入一個引數,則會從新索引行:
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index=[1,4,5],columns=['Ohio','Texas','California'])
frame2 = frame.reindex([1,2,4,5])
frame2
| Ohio | Texas | California | |
|---|---|---|---|
| 1 | 0.0 | 1.0 | 2.0 |
| 2 | NaN | NaN | NaN |
| 4 | 3.0 | 4.0 | 5.0 |
| 5 | 6.0 | 7.0 | 8.0 |
states = ['Texas','Utah','California']
frame.reindex(columns=states)
| Texas | Utah | California | |
|---|---|---|---|
| 1 | 1 | NaN | 2 |
| 4 | 4 | NaN | 5 |
| 5 | 7 | NaN | 8 |
填充資料只能按行填充,此時只能對行進行重新索引:
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])
frame.reindex(['a','b','c','d'],method = 'bfill')
#frame.reindex(['a','b','c','d'],method = 'bfill',columns=states) 報錯
| Ohio | Texas | California | |
|---|---|---|---|
| a | 0 | 1 | 2 |
| b | 3 | 4 | 5 |
| c | 3 | 4 | 5 |
| d | 6 | 7 | 8 |
丟棄指定軸上的值
可以使用drop方法丟棄指定軸上的值,不會對原DataFrame產生影響,指定行時axis = 0,指定列時axis = 1(axis預設值為0)
#原值
frame
| Ohio | Texas | California | |
|---|---|---|---|
| a | 0 | 1 | 2 |
| c | 3 | 4 | 5 |
| d | 6 | 7 | 8 |
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])
new_frame = frame.drop('a',axis=0)
#丟棄后
new_frame
| Ohio | Texas | California | |
|---|---|---|---|
| c | 3 | 4 | 5 |
| d | 6 | 7 | 8 |
new_frame = frame.drop(['Ohio'],axis=1)
#丟棄后
new_frame
| Texas | California | |
|---|---|---|
| a | 1 | 2 |
| c | 4 | 5 |
| d | 7 | 8 |
算術運算
DataFrame在進行算術運算時會進行補齊,在不重疊的部分補足NA:
df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado'])
df2 = pd.DataFrame(np.arange(12).reshape((4,3)),columns = list('bde'),index=['Utah','Ohio','Texas','Oregon'])
df1 + df2
| b | c | d | e | |
|---|---|---|---|---|
| Colorado | NaN | NaN | NaN | NaN |
| Ohio | 3.0 | NaN | 6.0 | NaN |
| Oregon | NaN | NaN | NaN | NaN |
| Texas | 9.0 | NaN | 12.0 | NaN |
| Utah | NaN | NaN | NaN | NaN |
可以使用fill_value方法填充NA資料,不過兩個df中都為NA的資料,該方法不會填充
df1.add(df2,fill_value=0)
df1
| b | c | d | |
|---|---|---|---|
| Ohio | 0 | 1 | 2 |
| Texas | 3 | 4 | 5 |
| Colorado | 6 | 7 | 8 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/203194.html
標籤:其他
上一篇:Python入門基礎語法知識2
