文件讀入
Pandas可以將讀取到的表格型數據(文件不一定要是表格)轉成DataFrame類型的數據結構,然後我們可以通過操作DataFrame進行數據分析,數據預處理以及行和列的操作等。
1、read_csv函數
功能:從文件、URL、文件新對象中加載帶有分隔符的數據(無論文件尾綴是什麼),默認分隔符是逗號(可以更改參數 sep=",")。
文件形如:
a,b,c,d,name
1,2,3,4,python
5,6,7,8,java
9,10,11,12,c++
使用情形一
data = pd.read_csv("data.txt")
print(data) # 在只含路徑參數時,行索引自動數字,列索引默認第一行
'''
a b c d name
0 1 2 3 4 python
1 5 6 7 8 java
2 9 10 11 12 c++
'''
使用情形二
df = pd.read_csv("a.txt", header=None)
print(df)
0 1 2 3 4
0 a b c d name
1 1 2 3 4 python
2 5 6 7 8 java
3 9 10 11 12 c++
import pandas as pd
df = pd.read_csv("a.txt", header=0)
print(df)
a b c d name
0 1 2 3 4 python
1 5 6 7 8 java
2 9 10 11 12 c++
使用情形三
df = pd.read_csv("a.txt", names=["z","x","c","v","b"]) # 分配列索引給表格
print(df)
z x c v b
0 a b c d name
1 1 2 3 4 python
2 5 6 7 8 java
3 9 10 11 12 c++
使用情形四
df = pd.read_csv("a.txt", index_col="name") # 指定原文件的某一列作爲行索引
print(df)
a b c d
name
python 1 2 3 4
java 5 6 7 8
c++ 9 10 11 12
使用情形五
df = pd.read_csv("a.txt", nrows=2) # 指定讀取文件的行數
print(df)
a b c d name
0 1 2 3 4 python
1 5 6 7 8 java
2.read_excel函數
pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None)
使用方法和cvs一致。
Padas的簡單使用
pandas的兩個基本的數據結構之一:Series
- 它是將要介紹的另外一個數據結構的單元數據結構,相當於一個矩陣中的列向量,不過,這個列向量是由另一個相關的索引向量標記的,索引在左邊,值在右邊;形如:
# 創建默認索引的
obj = pd.Series([2,9,5,6])
obj
Out[4]:
0 2
1 9
2 5
3 6
dtype: int64
# 創建指定索引的
obj2 = pd.Series([3,3,4,4,5],index=['a','b','c','d','e'])
obj2
Out[10]:
a 3
b 3
c 4
d 4
e 5
dtype: int64
# 強制更改索引
obj2.index = ["o","v","c","l"]
沒有指定索引,默認是從 0 - N-1。
- 可以通過Series的兩個屬性,index 和 value 來分別獲取索引和值
obj.index
Out[5]: RangeIndex(start=0, stop=4, step=1)
obj.values
Out[7]: array([2, 9, 5, 6], dtype=int64)
- 支持字典式取值,字典式 in 詢問
obj2['a']
Out[12]: 3
- 支持字典創建
obj3=pd.Series({"a":1,"b":2,"c":3})
obj3
Out[14]:
a 1
b 2
c 3
dtype: int64
# 如果字典創建的時候,還指定了索引順序,那麼將按照指定的索引排列,可以拋棄某個舊的索引(此條目將丟失),也可以創建新的索引,原來沒有將爲nan.
obj3=pd.Series({"a":1,"b":2,"c":3},index=["b","a","d"])
obj3
Out[16]:
b 2.0
a 1.0
d NaN
dtype: float64
- 檢測是否有nan值
pd.isnull(obj3)
Out[17]:
b False
a False
d True
dtype: bool
- Seriers 在運算時以 索引自動對齊運算
obj2+obj3
Out[19]:
a 4.0
b 5.0
c NaN
d NaN
e NaN
dtype: float64
- Series 索引的 name 和 值的 name(相當於這兩個向量的名字)
obj3.name
obj3.name="population"
obj3.index.name="ind"
obj3
Out[23]:
ind
b 2.0
a 1.0
d NaN
Name: population, dtype: float64
pandas的兩個基本的數據結構之二:DataFrame
構造DF
- DataFrame是一個典型的表格型數據,既有行索引,又有列索引。可以看成是,一個大字典,字典的鍵是 列索引,字典的值是一個Series; 構成這些索引的每一個值的Series都是共用一個 Series 索引的。
data = {"cities":["bj","bj","bj","bj"],
"year":[2001,2002,2003,2004],
"popular":[8,9,10,11]}
df = pd.DataFrame(data)
df
Out[34]:
cities year popular
0 bj 2001 8
1 bj 2002 9
2 bj 2003 10
3 bj 2004 11
# 和serries一樣(通過字典創建時指定index),Dataframe 創建的時候可以指定columns
df1 = pd.DataFrame(data,columns=["year","popular","new"])
df1
Out[36]:
year popular new
0 2001 8 NaN
1 2002 9 NaN
2 2003 10 NaN
3 2004 11 NaN
''' 也可以用字典的字典創建'''
data = {"cities":{2001:"bj",2002:"bj",2003:"bj"}, "money":{2004:20000,2002:10000,2003:1500}}
df3 = pd.DataFrame(data)
df3
Out[48]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
- DataFrame 默認通過 列索引獲取一個series;(在series中默認通過索引獲取一個值)
df["popular"] 或者 df.popular
Out[37]:
0 8
1 9
2 10
3 11
Name: popular, dtype: int64
- DataFrame 通過 ix 間接獲取行向量,行向量也是一個series,它的索引是原來DF的列索引。
df.loc[2]
Out[40]:
cities bj
year 2003
popular 10
Name: 2, dtype: object
- 列可以通過直接賦值的方式修改
df["popular"]=2
df
Out[43]:
cities year popular
0 bj 2001 2
1 bj 2002 2
2 bj 2003 2
3 bj 2004 2
- DateFrame中產生新的列,就是爲不存在的列名賦值即可
df["my_add"]=[1,1,4,5]
df
Out[45]:
cities year popular my_add
0 bj 2001 2 1
1 bj 2002 2 1
2 bj 2003 2 4
3 bj 2004 2 5
- 注意,DF中通過索引返回的series都是視圖,一切的修改都會反映到DF上面。
- DF的轉置,很簡單,就是行變成列,列變成行。
df3
Out[48]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df3.T
Out[49]:
2001 2002 2003 2004
cities bj bj bj NaN
money NaN 10000 1500 20000
除了這些常用的構造DF方法外,DataFrame還可以接收 (二維數組,numpy二維數組)
DF的基本功能
- 和series一樣設置 index 與 columns 的name屬性 值
df.index.name="index_"
df.columns.name="rrr"
df
Out[52]:
rrr cities year popular my_add
index_
0 bj 2001 2 1
1 bj 2002 2 1
2 bj 2003 2 4
3 bj 2004 2 5
- 與series一樣,values屬性返回 二維表的值
df.values
Out[53]:
array([['bj', 2001, 2, 1],
['bj', 2002, 2, 1],
['bj', 2003, 2, 4],
['bj', 2004, 2, 5]], dtype=object)
- index對象,軸標籤(就是DF的行標籤)
index一旦設定不可更改
df3
Out[55]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df3.index
Out[56]: Int64Index([2001, 2002, 2003, 2004], dtype='int64')
- 重新索引 reindex 功能
由於索引 index 不可更改,所以,這個方法將創建一個適應新索引的 新的 DF對象
df3
Out[55]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df4=df3.reindex([2011,2002,2003])
df4
Out[60]:
cities money
2011 NaN NaN
2002 bj 10000.0
2003 bj 1500.0
注意,如果新的索引以前不存在,將默認nan,不過可以在 reinde 中用 fill_value 參數指定nan爲其他數值。method參數可以指定像前或向後插值填充。
- reindex 默認“修改” 行索引,通過參數columns=[ ];修改列索引
Out[61]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df3.reindex(columns=["yingtan","nanchang"])
Out[62]:
yingtan nanchang
2001 NaN NaN
2002 NaN NaN
2003 NaN NaN
2004 NaN NaN
注意,可以同時在reindex中利用 index=[ ] , columns= [ ];對行列同時重新索引。
- 丟棄指定軸上的項(可以用reindex,整體選擇留下來的df新對象,也可以用drop來生成一個刪除特定項的新df對象)
df3
Out[63]:
cities money
2001 bj NaN
2002 bj 10000.0
2003 bj 1500.0
2004 NaN 20000.0
df_0 = df3.drop([2002])
df_0
Out[66]:
cities money
2001 bj NaN
2003 bj 1500.0
2004 NaN 20000.0
注意dorp默認是drop行的數據,如果需要drop列的數據,加參數 axis=1
p130