Python資料處理——Pandas模組使用(六)
阿新 • • 發佈:2019-02-20
本文主要介紹pandas資料清洗,排序,索引設定,資料選取
資料清洗
- 更改資料格式astype()
isin #計算一個“Series各值是否包含傳入的值序列中”的布林陣列
unique #返回唯一值的陣列
value_counts #返回一個Series,其索引為唯一值,值為頻率,按計數降序排列
- 丟棄值drop()
df.drop(labels, axis=1)# 按列(axis=1),丟棄指定label的列,預設按行
df=df.drop(labels, axis=1)# 注意,這一個賦值操作的df已經被改變,而上一個操作df沒被改變
- 丟棄缺失值dropna()
# 預設axi=0(行);1(列),how=‘any’
df.dropna()#每行只要有空值,就將這行刪除
df.dropna(axis=1)#每列只要有空值,整列丟棄
df.dropna(how='all')# 一行中全部為NaN的,才丟棄該行
df.dropna(thresh=3)# 每行至少3個非空值才保留
- 缺失值填充fillna()
df.fillna(0)
df.fillna({1:0,2:0.5}) #對第一列nan值賦0,第二列賦值0.5
df.fillna(method='ffill') #在列方向上以前一個值作為值賦給NaN
- 值替換replace()
# 將df的A列中 -999 全部替換成空值
df['A'].replace(-999, np.nan)
#-999和1000 均替換成空值
obj.replace([-999,1000], np.nan)
# -999替換成空值,1000替換成0
obj.replace([-999,1000], [np.nan, 0])
# 同上,寫法不同,更清晰
obj.replace({-999:np.nan, 1000:0})
- 重複值處理duplicated(),unique(),drop_duplictad()
df.duplicated()#兩行每列完全一樣才算重複,後面重複的為True,第一個和不重複的為false,返回true
#和false組成的Series型別
df.duplicated('key')#兩行key這一列一樣就算重複
df['A'].unique()# 返回唯一值的陣列(型別為array)
df.drop_duplicates(['k1'])# 保留k1列中的唯一值的行,預設保留第一行
df.drop_duplicates(['k1','k2'], take_last=True)# 保留 k1和k2 組合的唯一值的行,take_last=True 保留最後一行
排序
- 索引排序
# 預設axis=0,按行索引對行進行排序;ascending=True,升序排序
df.sort_index()
# 按列名對列進行排序,ascending=False 降序
df.sort_index(axis=1, ascending=False)
- 值排序
# 按值對Series進行排序,使用order(),預設空值會置於尾部
s = pd.Series([4, 6, np.nan, 2, np.nan])
s.order()
df.sort_values(by=['a','b'])#按列進行排序
- 排名
a=Series([7,-5,7,4,2,0,4])
a.rank()#預設method='average',升序排名(ascending=True),按行(axis=0)
#average 值相等時,取排名的平均值
#min 值相等時,取排名最小值
#max 值相等時,取排名最大值
#first值相等時,按原始資料出現順序排名
索引設定
修改列名
df.rename(columns = {'key':'key2'},inplace=True)
reindex()
更新index或者columns,
預設:更新index,返回一個新的DataFrame
# 返回一個新的DataFrame,更新index,原來的index會被替代消失
# 如果dataframe中某個索引值不存在,會自動補上NaN
df2 = df1.reindex(['a','b','c','d','e'])
# fill_valuse為原先不存在的索引補上預設值,不在是NaN
df2 = df1.reindex(['a','b','c','d','e'], fill_value=0)
# inplace=Ture,在DataFrame上修改資料,而不是返回一個新的DataFrame
df1.reindex(['a','b','c','d','e'], inplace=Ture)
# reindex不僅可以修改 索引(行),也可以修改列
states = ["Texas","Utah","California"]
df2 = df1.reindex( columns=states )
- set_index()
將DataFrame中的列columns設定成索引index
打造層次化索引的方法
# 將columns中的其中兩列:race和sex的值設定索引,race為一級,sex為二級
# inplace=True 在原資料集上修改的
adult.set_index(['race','sex'], inplace = True)
# 預設情況下,設定成索引的列會從DataFrame中移除
# drop=False將其保留下來
adult.set_index(['race','sex'], inplace = True)
- reset_index()
將使用set_index()打造的層次化逆向操作
既是取消層次化索引,將索引變回列,並補上最常規的數字索引
df.reset_index()
資料選取
[]
只能對行進 行(row/index) 切片,前閉後開df[0:3],df[:4],df[4:]where 布林查詢
df[df["A"]>7]
- isin
# 返回布林值
s.isin([1,2,3])
df['A'].isin([1,2,3])
df.loc[df['A'].isin([5.8,5.1])]#選取列A中值為5.8,5.1的所有行組成dataframe
- query
多個where整合切片,&:於,|:或
df.query(" A>5.0 & (B>3.5 | C<1.0) ")
- loc :根據名稱Label切片
# df.loc[A,B] A是行範圍,B是列範圍
df.loc[1:4,['petal_length','petal_width']]
# 需求1:建立一個新的變數 test
# 如果sepal_length > 3 test = 1 否則 test = 0
df.loc[df['sepal_length'] > 6, 'test'] = 1
df.loc[df['sepal_length'] <=6, 'test'] = 0
# 需求2:建立一個新變數test2
# 1.petal_length>2 and petal_width>0.3 = 1
# 2.sepeal_length>6 and sepal_width>3 = 2 3.其他 = 0
df['test2'] = 0
df.loc[(df['petal_length']>2)&(df['petal_width']>0.3), 'test2'] = 1
df.loc[(df['sepal_length']>6)&(df['sepal_width']>3), 'test2'] = 2
iloc:切位置
df.iloc[1:4,:]
ix:混切
名稱和位置混切,但效率低,少用
df1.ix[0:3,['sepal_length','petal_width']]
- map與lambda
alist = [1,2,3,4]
map(lambda s : s+1, alist)#map就是將自定義函式應用於Series每個元素
df['sepal_length'].map(lambda s:s*2+1)[0:3]
- apply和applymap
apply和applymap是對dataframe的操作,前者操作一行或者一列,後者操作每個元素
These are techniques to apply function to element, column or dataframe.
Map: It iterates over each element of a series.
df[‘column1’].map(lambda x: 10+x), this will add 10 to each element of column1.
df[‘column2’].map(lambda x: ‘AV’+x), this will concatenate “AV“ at the beginning of each element of column2 (column format is string).
Apply: As the name suggests, applies a function along any axis of the DataFrame.
df[[‘column1’,’column2’]].apply(sum), it will returns the sum of all the values of column1 and column2.
df0[['data1']].apply(lambda s:s+1)
ApplyMap: 對dataframe的每一個元素施加一個函式
func = lambda x: x+2
df.applymap(func), dataframe每個元素加2 (所有列必須數字型別)
- contains
# 使用DataFrame模糊篩選資料(類似SQL中的LIKE)
# 使用正則表示式進行模糊匹配,*匹配0或無限次,?匹配0或1次
df_obj[df_obj['套餐'].str.contains(r'.*?語音CDMA.*')]
# 下面兩句效果一致
df[df['商品名稱'].str.contains("四件套")]
df[df['商品名稱'].str.contains(r".*四件套.*")]