天天看點

03pandas

一.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]))

03pandas

3)切片和索引

03pandas

切片:直接傳入strat end或步長即可

索引:一個的時候直接傳入序号或者index,多個的時候傳入序号或者index的清單

4)索引和值

l  擷取索引 t.index

l  擷取值 t.values

03pandas

2.DataFrame

2.1簡介

DataFrame是一個表格型的資料結構,它含有一組有序的列,每列可以是不同類型的值。DataFrame既有行索引也有列索引,它可以被看做是由Series組成的字典(共用同一個索引),資料是以二維結構存放的。

l  類似多元數組/表格資料 (如,excel, R中的data.frame)

l  每列資料可以是不同的類型

l  索引包括列索引和行索引

2.2操作

  1. 通過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基礎屬性

03pandas

2.4整體情況查詢

03pandas

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 通過位置擷取行資料

03pandas
03pandas

指派更改資料:

03pandas

2.8布爾索引

03pandas

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

預設情況下他是把行索引相同的資料合并到一起

03pandas

2.merge

按照指定的列把資料按照一定的方式合并到一起

1)       預設的合并方式inner,并集

2)       merge outer,交集,NaN補全

3)       merge left,左邊為準,NaN補全

4)       merge right,右邊為準,NaN補全

03pandas
03pandas

五.分組和聚合

1)groupby方法

grouped = df.groupby(by="columns_name")

grouped是一個DataFrameGroupBy對象,是可疊代的

grouped中的每一個元素是一個元組

元組裡面是(索引(分組的值),分組之後的DataFrame)

2)DataFrameGroupBy對象有很多經過優化的方法

03pandas

六.索引和複合索引

簡單的索引操作:

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()

03pandas

七.時間序列

1.使用

pd.date_range(start=起始時間, end=“”, periods=生成個數, freq=\'D\')

start和end以及freq配合能夠生成start和end範圍内以頻率freq的一組時間索引

start和periods以及freq配合能夠生成從start開始的頻率為freq的periods個時間索引

2.關于freq頻率的更多縮寫

03pandas

3. 使用pandas提供的方法把時間字元串轉化為時間序列

df["timeStamp"] = pd.to_datetime(df["timeStamp"],format="")

format參數大部分情況下可以不用寫,但是對于pandas無法格式化的時間字元串,我們可以使用該參數,比如包含中文

4.重采樣

重采樣:指的是将時間序列從一個頻率轉化為另一個頻率進行處理的過程,将高頻率資料轉化為低頻率資料為降采樣,低頻率轉化為高頻率為升采樣

03pandas

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]))