利用python進行數據分析pandas_數據轉換

# -*- coding: utf-8 -*-
"""
Created on Mon Oct 28 14:26:56 2019

@author: weiping
"""

import pandas as pd
import numpy as np

df = pd.DataFrame({'k1':['a']*3 + ['b']*4,
                   'k2':[2,2,3,3,1,1,5]})

'''
重複數據
'''
df.duplicated()#返回bool值
df.drop_duplicates() #刪除所有重複行 類似 distinct
df.drop_duplicates(['k1']) #按照k1去重 值保留 k1列的 非重值
'''
Out[78]: 
  k1  k2
0  a   2
3  b   3
'''

'''
利用函數或者映射進行數據轉換
'''
df = pd.DataFrame({'key':['a','A','b','C','F'],
                   'value':np.arange(5)})
    
df['key2'] = df['key'].map(lambda s : s.lower()) #轉化小寫
'''
map方法可以接受一個函數或者含有映射關係的字典
'''
'''
替換replace
'''
df = pd.DataFrame({'key':['a','A','b','C','F'],
                   'value':np.arange(5)})
    
df.replace(4,500)
df.replace([2,3,4],np.nan)
df.replace([2,3,4],[22,33,44])
df.replace({2:222,3:333})

'''
修改列名
'''
df.rename(columns = str.upper) #不會修改原數據,生成一個新的數據框
df.columns = df.columns.map(str.upper) # 直接修改原數據表字段名

'''
連續數據的離散化(分組)
'''
age = pd.DataFrame(np.random.rand(100)*100,columns = ['k'])
bins = [0,18,25,35,45,55,65,100]#設置分割區間,
age2 = pd.cut(age['k'],bins) #數據離散化 默認前開後閉的(0,18] ,可以設置 right= False 修改成 [0,18 )
age3 = pd.cut(age['k'],[0,30,50,80,100],labels = ['xs','s','m','l'],right = False) #labels可以設置區間名稱

age4 = pd.cut(age['k'],5)
'''
可以直接傳入 數值(5)默認 按數據的最大最小值 5等分
qcut 按數據的分位數 進行分割,基本 每個區間樣本數據差不多
'''
age5 = pd.qcut(age['k'],5)
pd.value_counts(age5)
'''
Out[128]: 
(77.516, 98.818]                20
(56.444, 77.516]                20
(43.625, 56.444]                20
(22.351, 43.625]                20
(2.5780000000000003, 22.351]    20
Name: k, dtype: int64
'''
age6 = pd.qcut(age['k'],[0,0.1,0.5,0.8,1])

'''
隨機抽樣(np.random.permutation)
permutation:產生一個隨機序列
'''
np.random.seed(100)
np.random.permutation(10) # Out[137]: array([9, 2, 1, 5, 3, 6, 0, 7, 4, 8])
np.random.permutation(10),np.random.permutation(10)

df = pd.DataFrame(np.arange(16).reshape(8,2),columns = ['a','b'])
np.random.seed(100)

df1 = df.take(np.random.permutation(len(df))[0:3]) # 利用隨機序列抽樣數據,會打亂原始順序
df2 = df.take(np.random.permutation(len(df))[3:]) # 無法用於隨機分割數據集,每次隨機序列不一致
#可以先生成隨機序列之後在 分段選取 達到隨機分爲兩個數據集的目的
np.random.seed(100) # 設置隨機種子 保證每次隨機序列一致 結果可復現
test_s = len(df)*0.3  #設置抽樣佔比
df1 = df.take(np.random.permutation(len(df))) #生成打亂index後的序列
df11 = df1.iloc[:int(test_s)]
df12 = df1.iloc[int(test_s):]

'''
啞變量(獨熱編碼\one_hat) get_dummies 
'''
df = pd.DataFrame({'key':['a','b','c','a','d','c'],
                   'value': range(6)})
    
pd.get_dummies(df['key'])
pd.get_dummies(df['key'],prefix = 'key') # 給啞變量後的列名加個 'key'的前綴

df_with_dumm = pd.get_dummies(df['key']).join(df['value']) #.join 表示左連接

#對於建模分析 可以對連續數據 先離散化 在啞變量,往往會有些其他發現

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章