1 數據合并
- 軸向連接 pd.concat()
- 沿縱向軸合并:axis=0
- 沿橫向軸合并:axis=1
frames = [df1, df2]
pd.concat(frames) #上下連接
#pd.concat(frames, axis=1) 左右連接
pd.concat(frames, axis=1, keys=['df1', 'df2']) # 層次化索引
pd.concat(frames, axis=1, join='inner') # 0軸索引取交集
pd.concat(frames, axis=1, join_axes=[df1.index]) #只用原始索引
- 通過join_axes指定其他州的索引扮超,不進行交并運算璧疗。
2 數據融合技術
2.1 使用pd.merge()
- 默認將重合列作為鍵,也可以通過參數on指定矢炼。
- 通過參數how指定融合方式(left系瓢,right,inner句灌,outer)
- 融合指標變量indicator夷陋,默認為False,如果設為True胰锌,則增加_merge(取值為left_only,right_only资昧,both)∨捣玻可以設為一個字符串表示列名践惑。
- 指定左鍵和右鍵:left_on,right_on
- 融合后相同名稱列默認會產生后綴尔觉,可以使用suffixes來利用原列名及后綴產生新的列名。
- 索引-列合并
pd.merge(left, right, left_index= True, right_on='...', how='outer')
2.2 使用join融合
left.join(right, how='outer')
join默認融合方法how='left'
- 索引-列融合
#這兩個方法是等價的
left.join(right, on=key_or_keys)
pd.merge(left, right, left_on=key_or_keys, right_index=True,how='left', sort=False)
2.3 combine_first 缺失值填補
-用df1的值來填補df2
df2.combine_first(df1)
3 排序和隨機采樣
df.sort_values('loan_amnt')
df.sort_index()
- 默認ascending=True专甩,若改為False則為降序。
- 如果不是順序或降序涤躲,想要重排:
- 先通過np.random.permutation產生重排后的數組
- 再用.iloc或take函數
sampler = np.random.permutation(10)
df.take(sampler)
df.take(np.random.permutation(3)) # 0,1,2的重排
df.sample(3) #任意三個
4 離散化及面元劃分
- cut()和qcut()函數
- cut():等距離散化
bins = [0, 10000, 20000, 30000, 40000]
pd.cut(df['loan_amnt'], bins)
#添加標簽
labels = ['A', 'B', 'C', 'D']
pd.cut(df['loan_amnt'], bins=bins, labels=labels)
- qcut():等頻離散化
cats = pd.qcut(df['loan_amnt’], 5)
cats.value_counts()
實際每個區(qū)間的數量并不一定是理想中的等量
5 數據轉換
- map()函數
df['loan_status'].map(str.title) # 產生了一個新的Series對象
df['loan_status'] = df['loan_status'].map(str.title) #替換原來的數據
# 利用字典
mapper = {‘Fully Paid’:0, 'Charged Off':1}
df['indicator'] = df['loan_status'].map(mapper)
- 替換值使用replace()
df.replace('10+ years', 'high')
# 多個种樱,用列表
df.replace(['10+ years', '4 years', '< 1 year'], [10, 4, 1])
#也可以用字典
mapper = {'10+ years':10, '4 years’:4, '< 1 year’:1}
df.replace(mapper) # 等價于map:df['emp_length'].map(mapper)
# 重命名索引
df.columns
df.columns.map(str.upper)
df.columns = df.columns.map(str.upper)
- 啞變量編碼get_dumies()
pd.get_dummies(df['home_ownership'])
dummies = pd.get_dummies(df['home_ownership'], prefix='home') #指定前綴
df[['loan_amnt','grade']].join(dummies) # 和原數據合并
pd.get_dummies(df) #DF對象亦可
pd.get_dummies(df, columns=['home_ownership'])
pd.get_dummies(df, columns=['home_ownership'], drop_first=True) # 去掉第一個編碼特征
6 文本數據規(guī)整
s.str.lower()
df.columns.str.lower()
df.columns.str.lower().str.replace(' ', '_')
- 分割元素
- 在str上使用索引
s = pd.Series(['name1 age1 sex1', 'name2 age2 sex2', 'name3 age3 sex3'])
s.str.split(" ").str[0]
- 使用str.get()
s.str.split(" ").str.get(0)
s.str.split(" ", expand=True) # 展開成DF
- 結合正則表達式
s.str.contains(r'\d')
s.str.replace(r'\d.', 'XX')
s.str.findall(r'\d.').str.get(0)
s.str.extract(r'(\d.)', expand=False)
s.str.get_dummies(sep=',')
(根據《Python數據分析基礎》整理)