剛剛使用Python學習進行數據分析,分享一些概念和想法,希望可以大家一起討論,如果理解或者表達有不準確的地方,請多多指點,不吝賜教,非常感謝~~
Pandas是一個第三方庫,主要功能是提供了 DataFrame這個數據結構,它可以讓我們直接在數據集上使用關係模型,比如分組(group by),聚合(agg)或者聯合(join)等操作。它是基於Numpy的數據分析庫。本文將分別介紹Series和DataFrame兩種數據結構的基本操作。
1. 什麼是Series和DataFrame
Series是Pandas提供的一種基礎數據類型,也是一個序列類型,它的大部分操作與Numpy的ndarray操作類型;同時也是一個索引類型,可以像Python中的字典一樣操作。但是和ndarray一樣,是隻能包含同一種類型元素的序列,與Python中的 list和字典不一樣。每個Series對象都有index和values組成:index是從Numpy繼承的index對象,保存標籤信息;values保存值(如上所述,index也可以被看成標籤 key)
DataFrame是一個將數據存儲爲行和列的對象。可以將DataFrame視爲電子表格或SQL表格。它的每列都有一個名稱,是一個字符串;每行都有一個索引,是一個整數。DataFrames可以包含許多不同的數據類型:字符串,整數,浮點數,元組等。
2. 創建
- 創建Series
(1)直接創建:pd.Series([1,0.3,np.nan])
(2)從Python的list中創建:pd.Series(list([1,0.3,np.nan]))
(3)從Numpy的ndarray中創建:pd.Series(np.array([1,0.3,np.nan]))
我們能看到打印Series的時候,第一列有一個序列號,這就是Series的索引部分。如果我們不自定義索引,系統會生成自增的鍵,如圖示。
(4)自定義索引:pd.Series([1,0.3,np.nan] , index = ["a","b","c"])
(5)從Python的字典創建:pd.Series({"a":1 , "b":0.3 , "c":np.nan})
直接定義了索引
- 創建DataFrame
(1)使用dictionary添加Dataframe
:key爲Dataframe中的列名;value爲Dataframe中列名下對應的列數據(要求value個數一致)
df1 = pd.DataFrame({
'name': ['John Smith', 'Jane Doe', 'Joe Schmo'],
'address': ['123 Main St.', '456 Maple Ave.', '789 Broadway'],
'age': [34, 28, 51]
})
(2)使用 list of lists 添加Dataframe
:每個列表代表一行數據;可以使用關鍵字columns定義列名(如果不定義會和 index一樣,系統自動生成一個自增序列)
df2 = pd.DataFrame([
['John Smith', '123 Main St.', 34],
['Jane Doe', '456 Maple Ave.', 28],
['Joe Schmo', '789 Broadway', 51]
],
columns=['name', 'address', 'age'])
(3)從Numpy的ndarray中創建:pd.DataFrame(np.random.randn(5,4), columns=list("aasd"))
(4)從csv文件加載數據:pd.read_csv(" dir ", index_col=n)
通常使用是在對dataframe操作之後,數據中有一個列沒有實際的效用,生成出來的0123456的序列,即列Unnamed:0,如果這個時候不使用它作爲index就會出現:
index_col參數的含義是:將index=n的列作爲索引
data=pd.read_csv("/Users/MachineLearning/03_Preprocessing:Dimensionality_reduction/Narrativedata.csv",index_col=0)
3. 查看數據
以下列數據爲例:
data = pd.DataFrame(np.random.randn(6,4),columns=list('ABCD'))
- 查看數據維度信息:
data.shape
- 查看每列數據的統計信息:
data.info()
- 查看每列數據的數據類型:
data.dtypes
- 輸出行索引:
data.index
- 輸出列索引:
data.columns
- 查看數據:
data
或data.head(n)
- 查看數據的值:
data.values
- 選擇行數據:
(1)選擇一行數據:data.loc[index]
或data.iloc[index]
(2)選擇多行數據:
a. data.loc[2:4]
b. data.iloc[2:4]
或data[2:4]
.loc[k]是讀取dataframe中index爲k的那一行
.iloc[k]是讀取dataframe中的第k行
- 選擇列數據:
(1)選擇某一列:data.B
或data["B"]
或data.loc[ :, "B"]
或data.iloc[ :, 1]
(2)選擇多列:data[['A','B']]
或data.loc[ :, ["A","B"]]
或data.iloc[:,[ 0,1]]
或data.iloc[:,[ 0:2]]
- 選擇滿足條件的數據:
(1)邏輯判斷所有元素:data[data>0]
(2)使用列邏輯判斷,展示將滿足條件的所有行數據:data[data.A>0]
(3)滿足某列中值爲x的所有行數據:data[data.target.isin(["1","0"])]
** (以“賦值”操作之後的數據爲例)
4. 賦值
(1)複製數據:data.cope()
(2)給某個元素賦值:data.iat[0,0] = 100
(3)給某列中的某幾個元素賦值:data.loc[data.index[1:3],'C'] = 200
(4)新增一列:data["target"]=np.random.randint(0,3,size=6)
(5)給某列賦值:data.B=200
或data["B"]=200
或data.loc[:,["B","D"]]=150
或data.iloc[:,[1,3]]=150
(6)給某列的索引名重新賦值:data.rename(columns={'target':'TAG'})
(7)給全部列的索引重命名:data.columns=["a","b","c","d","e","f"]
(8)給全部行索引重命名:data.index=["a","b","c","d","e","f"]
(9)新增一行:data.append(data_series, ignore_index = True)
(10)爲NaN元素賦值:data.fillna(n)
5. 刪除
- 刪除有空值的行或列:
data.dropna(axis=0, inplace=False)
- 刪除某行或某列:
data.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
使用數據:
data = pd.DataFrame(np.random.randn(6,4),columns=list('ABCD'))
(1)刪除列:使用label+axis參數或者直接使用columns參數
data.drop(["A","C"],axis=1)
# or
data.drop(columns=["A","C"])
(2)刪除行:直接使用index參數
data.drop(index=[2,5])
6.常用函數
常用接口 | 參數 | 返回值 | 說明 | |
---|---|---|---|---|
1 | data.mean() | axis=0/1默認值爲0 | Series | 求列平均值 |
2 | data.std() | axis=0/1默認值爲0 | Series | 求每列的標準差 |
3 | data.median() | axis=0/1默認值爲0 | Series | 求每列的中位數 |
4 | data.min() | axis=0/1默認值爲0 | Series | 求每列的最小值 |
5 | data.max() | axis=0/1默認值爲0 | Series | 求每列的最大值 |
6 | data.sum() | axis=0/1默認值爲0 | DataFrame/Series | 對每列求和 |
7 | data.cumsum() | axis=0/1默認值爲0 | DataFrame/Series | 對每行進行累加 |
8 | data.nunique() | axis=0/1默認值爲0 | int/Series | 統計Series中不同值的個數/統計DataFrame中每列中幾個不同值 |
9 | data_series.mode() | Series | 常用在返回對Series中出現最多的元素 | |
10 | data_series.unique() | ndarray | 只能用在統計Series中存在的不重複元素 | |
11 | data_series.value_counts() | Series | 只能用在統計Series中每個元素出現的次數 | |
12 | pd.isnull(data) | 要被判斷的Series或者Dataframe | bool類型的Series/DataFrame | 判斷Series或者Dataframe中每個元素是否爲NaN |