一.pandas簡述
1)pandas是一個開源的,BSD許可的庫,為Python程式設計語言提供高性能,易于使用的資料結構和資料分析工具。
2)numpy能夠幫助我們處理數值,但是pandas除了處理數值之外(基于numpy),還能夠幫助我們處理其他類型的資料
二.pandas的資料類型
1.Series
1)Series是一種類似于一維數組的 對象,由一組資料(各種NumPy資料類型)以及一組與之對應的索引(資料标簽)組成。
l 類似一維數組的對象
l 由資料和索引組成
² 索引(index)在左,資料(values)在右
² 索引是自動建立的
2)建立
ser_obj = pd.Series(np.arange(10),index=list(string.ascii_uppercase[:10]))

3)切片和索引
切片:直接傳入strat end或步長即可
索引:一個的時候直接傳入序号或者index,多個的時候傳入序号或者index的清單
4)索引和值
l 擷取索引 t.index
l 擷取值 t.values
2.DataFrame
2.1簡介
DataFrame是一個表格型的資料結構,它含有一組有序的列,每列可以是不同類型的值。DataFrame既有行索引也有列索引,它可以被看做是由Series組成的字典(共用同一個索引),資料是以二維結構存放的。
l 類似多元數組/表格資料 (如,excel, R中的data.frame)
l 每列資料可以是不同的類型
l 索引包括列索引和行索引
2.2操作
- 通過ndarray建構DataFrame
代碼:
import numpy as np
# 通過ndarray建構DataFrame
array = np.random.randn(5,4)
print(array)
df_obj = pd.DataFrame(array)
print(df_obj.head())
輸出:
[[ 0.83500594 - 1.49290138 - 0.53120106 - 0.11313932 ]
[ 0.64629762 - 0.36779941 0.08011084 0.60080495 ]
[- 1.23458522 0.33409674 - 0.58778195 - 0.73610573 ]
[- 1.47651414 0.99400187 0.21001995 - 0.90515656 ]
[ 0.56669419 1.38238348 - 0.49099007 1.94484598 ]]
1 2 3
0.835006 - 1.492901 - 0.531201 - 0.113139
1 0.646298 - 0.367799 0.080111 0.600805
2 - 1.234585 0.334097 - 0.587782 - 0.736106
3 - 1.476514 0.994002 0.210020 - 0.905157
4 0.566694 1.382383 - 0.490990 1.944846
2.通過dict建構dataframe
代碼:
# 通過dict建構DataFrame
dict_data = {\'A\': 1,
\'B\': pd.Timestamp(\'20170426\'),
\'C\': pd.Series(1, index=list(range(4)),dtype=\'float32\'),
\'D\': np.array([3] * 4,dtype=\'int32\'),
\'E\': ["Python","Java","C++","C"],
\'F\': \'ITCast\' }
#print dict_data
df_obj2 = pd.DataFrame(dict_data)
print(df_obj2)
輸出:
A B C D E F
1 2017 - 04 - 26 1.0 3 Python ITCast
1 1 2017 - 04 - 26 1.0 3 Java ITCast
2 1 2017 - 04 - 26 1.0 3 C++ ITCast
3 1 2017 - 04 - 26 1.0 3 C ITCas
3.通過列索引擷取列資料(Series類型)
df_obj[col_idx] 或 df_obj.col_idx
4.增加列資料
df_obj[new_col_idx] = data
5.删除列
del df_obj[col_idx]
2.3基礎屬性
2.4整體情況查詢
2.5排序
df.sort_values(by="Count_AnimalName",ascending=False)
ascending參數預設為true,即升序排列
2.6取行、取列
1)取某一列df[" Count_AnimalName "]
2)取行取列df[:100][" Count_AnimalName "]
2.7 loc取行取列
1) df.loc 通過标簽索引行資料
2) df.iloc 通過位置擷取行資料
指派更改資料:
2.8布爾索引
2.9字元串方法
03pandas
三.資料處理
1) 判斷資料是否為NaN:pd.isnull(df),pd.notnull(df)
2) 處理缺失資料
l 方式1:删除NaN所在的行列dropna (axis=0, how=\'any\', inplace=False)
l 方式2:填充資料,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
3) 處理為0的資料:t[t==0]=np.nan
當然并不是每次為0的資料都需要處理
計算平均值等情況,nan是不參與計算的,但是0會
四.資料合并
1.join
預設情況下他是把行索引相同的資料合并到一起
2.merge
按照指定的列把資料按照一定的方式合并到一起
1) 預設的合并方式inner,并集
2) merge outer,交集,NaN補全
3) merge left,左邊為準,NaN補全
4) merge right,右邊為準,NaN補全
五.分組和聚合
1)groupby方法
grouped = df.groupby(by="columns_name")
grouped是一個DataFrameGroupBy對象,是可疊代的
grouped中的每一個元素是一個元組
元組裡面是(索引(分組的值),分組之後的DataFrame)
2)DataFrameGroupBy對象有很多經過優化的方法
六.索引和複合索引
簡單的索引操作:
l 擷取index:df.index
l 指定index :df.index = [\'x\',\'y\']
l 重新設定index : df.reindex(list("abcedf"))
l 指定某一列作為index :df.set_index("Country",drop=False)
l 傳回index的唯一值:df.set_index("Country").index.unique()
七.時間序列
1.使用
pd.date_range(start=起始時間, end=“”, periods=生成個數, freq=\'D\')
start和end以及freq配合能夠生成start和end範圍内以頻率freq的一組時間索引
start和periods以及freq配合能夠生成從start開始的頻率為freq的periods個時間索引
2.關于freq頻率的更多縮寫
3. 使用pandas提供的方法把時間字元串轉化為時間序列
df["timeStamp"] = pd.to_datetime(df["timeStamp"],format="")
format參數大部分情況下可以不用寫,但是對于pandas無法格式化的時間字元串,我們可以使用該參數,比如包含中文
4.重采樣
重采樣:指的是将時間序列從一個頻率轉化為另一個頻率進行處理的過程,将高頻率資料轉化為低頻率資料為降采樣,低頻率轉化為高頻率為升采樣
pandas提供了一個resample的方法來幫助我們實作頻率轉化
5.periodIndex
periods=pd.PeriodIndex(year=data["year"],month=data["month"],day=data["day"],hour=data["hour"],freq="H")
之前所學習的DatetimeIndex可以了解為時間戳,那麼現在我們要學習的PeriodIndex可以了解為時間段。
七.資料重構
1.stack
l 将行索引轉換為列索引,完成層級索引
l DataFrame->Seriees
示例代碼:
import numpy as np
import pandas as pd
df_obj = pd.DataFrame(np.random.randint(0,10, (5,2)), columns=[\'data1\', \'data2\'])
print(df_obj)
stacked = df_obj.stack()
print(stacked)
運作結果:
# print(df_obj)
data1 data2
0 7 9
1 7 8
2 8 9
3 4 1
4 1 2
# print(stacked)
0 data1 7
data2 9
1 data1 7
data2 8
2 data1 8
data2 9
3 data1 4
data2 1
4 data1 1
data2 2
dtype: int64
2. unstack
l 将層級索引展開
l Series->DataFrame
l 認操作内層索引,即level=-1
示例代碼:
# 預設操作内層索引
print(stacked.unstack())
# 通過level指定操作索引的級别
print(stacked.unstack(level=0))
運作結果:
# print(stacked.unstack())
data1 data2
0 7 9
1 7 8
2 8 9
3 4 1
4 1 2
# print(stacked.unstack(level=0))
0 1 2 3 4
data1 7 7 8 4 1
data2 9 8 9 1 2
八.資料轉換
1.處理重複資料
1) duplicated() 傳回布爾型Series表示每行是否為重複行
2) drop_duplicates() 過濾重複行
l 預設判斷全部列 df_obj.drop_duplicates()
l 可指定按某些列判斷 df_obj.drop_duplicates(\'data2\')
2.資料替換
replace根據值的内容進行替換
示例代碼:
# 單個值替換單個值
print(ser_obj.replace(1, -100))
# 多個值替換一個值
print(ser_obj.replace([6, 8], -100))
# 多個值替換多個值
print(ser_obj.replace([4, 7], [-100, -200]))