引言
Pandas是一個開源的Python庫,使用其強大的數據結構提供高性能的數據處理和分析工具。在Pandas之前,Python主要用於數據管理和准備。它對數據分析的貢獻很小。Pandas解決了這個問題。使用Pandas,無論數據來源如何 - 加載,准備,操作,建模和分析,我們都可以完成數據處理和分析中的五個典型步驟。它可以將數據從不同文件格式加載到內存數據對象的工具,然后進行數據清洗和預分析。
pandas數據結構介紹
- Series:一種類似於一維數組的對象,它是由一組數據(各種Numpy數據類型)以及一組與之相關的數據標簽(即索引)組成。僅由一組數據即可產生簡單的 Series。
- DataFrame:一個表格型的數據結構,含有一組有序的列,每列可以是不同的值類型(數值、字符串、布爾值等),DataFrame既有行索引也有列索引。
Series
series 和字典有些類似,字典是通過 key 索引找到對象的 value。series 通過 index 索引找到一組對象的 value。series 用的不多,主要介紹下怎么創建,我們把重點篇幅放在 dateframe 上。
1、一維數組創建
可以通過 Series() 創建 Series 對象,index可以指定,也可以不寫。
import pandas # 指定index值 series = pandas.Series([3999,4999],index=['xiaomi','huawei']) print(series)
輸出:
import pandas # 默認index series = pandas.Series([3999,4999]) print(series)
輸出:
2、字典創建
import pandas dic = {'xiaomi':3999,'huawei':4999} series = pandas.Series(dic) print(series)
輸出:
Dateframe
Dateframe 有兩個索引,一個行索引,另一個列索引。想象一下 excel 表格,就比較好理解了。
- 行索引:index,區分不同的行,axis = 0
- 列索引:column:區分不同的列,axis=1
1、創建 Dateframe 表格的幾種方式:
import pandas '''通過列表創建''' # 一、默認方式 df = pandas.DataFrame([['xiaomi',3999],['huawei',4999]]) # 二、list(dict) 方式 df = pandas.DataFrame([{'xiaomi':3999,'huawei':4999},{'xiaomi':2999,'huawei':5999}]) # 三、指定 index 和 columns df = pandas.DataFrame([['xiaomi',3999],['huawei',4999]],index=['100','101'],columns=['品牌','價格']) '''通過字典創建''' dic = {'xiaomi':[3999,2999],'huawei':[4999,5999]} df = pandas.DataFrame(dic) '''創建一個空表格''' # 指定列名的空表格 df = pandas.DataFrame(columns=['xiaomi','huawei'])
2、向表格中添加一行/列數據
'''添加行數據''' # ignore_index=True 要記得加上,表示新的表格不按原來的索引,從0開始自動遞增 df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999]}) # 添加一行數據 df = df.append({'xiaomi':1999,'huawei':6999},ignore_index=True) # 添加多行數據,使用list,list內元素為dict df = df.append([{'xiaomi':1999,'huawei':6999},{'xiaomi':999,'huawei':7999}],ignore_index=True) '''添加列數據''' # 方式一 df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999]}) # 直接命名列名,增加列的元素個數要跟原數據列的個數一樣。 df['顏色'] = ['白色','黑色'] # 方式二 # 第一個參數為列的位置,第二個參數為列名,第三個為列的values df.insert(2,'顏色',['白色','黑色']) # 添加一列空值 df['顏色']=numpy.nan
3、修改數據
df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999]}) '''方式一''' # 使用loc方法,loc[row_index,column] df.loc[0,'xiaomi'] = 1999 df.loc[1,'huawei'] = 6999 '''方式二''' # 使用iloc方法,iloc[row_index,column_index] df.iloc[0,0] = 1999 df.iloc[1,1] = 6999
4、查詢數據
df = pandas.DataFrame({'xiaomi':[3999,2999,2000,3000],'huawei':[4999,5999,4000,5000]}) '''查詢數據的幾種方式''' # 列名查詢 df['xiaomi'] df[['xiaomo','huawei']] # 行索引查詢 df[0:] # 第0行及以后的行索引,相當於全部數據 df[-1:] # 最后一行 df[1:3] # 第1行到第2行,不包含第3行 # loc方法 df.loc[1,'huawei'] # 精准查詢5999 df.loc[0:2,'huawei'] # huawei列第0到2行 df.loc[[1,2],['xiaomi','huawei']] #指定第1行到第2行,xiaomi和huawei列的數據 df.loc[df['xiaomi']==2000,'huawei'] #條件查詢,列xiaomi值為2000對應列huawei的值 df.loc[df['xiaomi']==2000,['huawei','xiaomi']] #iloc方法 df.iloc[0,0] # 精准查詢3999 df.iloc[[1,3],0:1] #第1行和3行,第0列和第1列的數據 df.iloc[1:3,[0,1]] # 第1行到第2行(不含第3行),第0列和第1列的數據
5、刪除數據
df = pandas.DataFrame({'xiaomi':[3999,2999,2000,3000],'huawei':[4999,5999,4000,5000]}) # 刪除第1和3行,axis : {0 or 'index', 1 or 'columns'} df.drop([1,3],axis=0,inplace=True) # 刪除列,axis : {0 or 'index', 1 or 'columns'} df.drop(['xiaomi'],axis=1,inplace=True) # 或者使用del ,也能達到同樣效果 del df['xiaomi']
6、替換所有表格中的 nan
# 將 nan 替換為0,inplace=True 原表格生效 df.fillna(0,inplace=True)
7、修改列名
df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999],'顏色':['白色','黑色']}) # 方式一 # rename方法 df.rename(columns={'xiaomi':'xiaomi','huawei':'huawei'},inplace=True) # 方式二 # 直接修改所有列名 df.columns = ['xiaomi','huawei','顏色']
8、調整列順序
df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999],'顏色':['白色','黑色']}) # 只改變列的順序,values隨着列的順序移動 df = df[['xiaomi','顏色','huawei']]
9、sort_values 方法排序
# 按'xiaomi'列values 排倒序。ascending=Ture 正序,False 倒序 df.sort_values(by=['xiaomi'], ascending=False,inplace=True)
10、分組統計
df = pandas.DataFrame({'xiaomi':[3999,2999,1999,999],'huawei':[4999,5999,6999,7999],'顏色':['白色','黑色','白色','黑色']}) #根據顏色分組,對各列進行計數。分組過后組名會變成外索引,as_index=False,不變成索引 df = df.groupby(['顏色'],as_index=False).count() #根據顏色分組,對xiaomi來計數 df = df.groupby(['顏色'],as_index=False).xiaomi.count() #根據顏色分組,對xiaomi來計數 df = df.groupby(['顏色'],as_index=False)['xiaomi'].count() #agg函數的用法: #用法1:對一列用2個函數 df = df.groupby(['顏色'],as_index=False).agg(['mean','max']) #用法2:對不同的列所用不同的聚合函數 df = df.groupby(['顏色'],as_index=False).agg({'xiaomi':'sum', 'huawei':'sum'})
11、dateframe 轉成 list、dict
df = pandas.DataFrame({'xiaomi':[3999,2999,1999,999],'huawei':[4999,5999,6999,7999],'顏色':['白色','黑色','白色','黑色']}) # 轉成list[list] df.values.tolist() # 轉成dict,orient參數有6組值,源碼里有注解,按需取即可 def to_dict(self, orient="dict", into=dict): """ Convert the DataFrame to a dictionary. The type of the key-value pairs can be customized with the parameters (see below). Parameters ---------- orient : str {'dict', 'list', 'series', 'split', 'records', 'index'} Determines the type of the values of the dictionary. - 'dict' (default) : dict like {column -> {index -> value}} - 'list' : dict like {column -> [values]} - 'series' : dict like {column -> Series(values)} - 'split' : dict like {'index' -> [index], 'columns' -> [columns], 'data' -> [values]} - 'records' : list like [{column -> value}, ... , {column -> value}] - 'index' : dict like {index -> {column -> value}} Abbreviations are allowed. `s` indicates `series` and `sp` indicates `split`. into : class, default dict The collections.abc.Mapping subclass used for all Mappings in the return value. Can be the actual class or an empty instance of the mapping type you want. If you want a collections.defaultdict, you must pass it initialized. '''
12、DataFrame與標量的加法運算
# 方式一 df = pandas.DataFrame({'xiaomi':[3999,2999,1999,999],'huawei':[4999,5999,6999,7999]}) # dataframe 所有的元素都+1000 df = df +1000 # dataframe 某一列元素+1000 df['xiaomi'] = df['xiaomi']+1000 # 方式二 # dataframe 所有的元素都+1000 df = df.add(1000) # 所有元素都加1000,fill_value給所有缺失值添加默認值 df = df.add(1000,fill_value=100)