python 數據清洗之數據合并、轉換、過濾、排序

CarBarkly 7年前發布 | 16K 次閱讀 數據清洗 Python Python開發

前面我們用pandas做了一些基本的操作,接下來進一步了解數據的操作,

數據清洗一直是數據分析中極為重要的一個環節。

數據合并

在pandas中可以通過merge對數據進行合并操作。

importnumpyas np
importpandasas pd
data1 = pd.DataFrame({'level':['a','b','c','d'],
                'numeber':[1,3,5,7]})
 
data2=pd.DataFrame({'level':['a','b','c','e'],
                'numeber':[2,3,6,10]})
print(data1)

結果為:

print(data2)

結果為:

print(pd.merge(data1,data2))

結果為:

可以看到data1和data2中用于相同標簽的字段顯示,而其他字段則被舍棄,這相當于SQL中做inner join連接操作。

此外還有outer,ringt,left等連接方式,用關鍵詞how的進行表示。

data3 = pd.DataFrame({'level1':['a','b','c','d'],
                'numeber1':[1,3,5,7]})
data4=pd.DataFrame({'level2':['a','b','c','e'],
                'numeber2':[2,3,6,10]})
print(pd.merge(data3,data4,left_on='level1',right_on='level2'))

結果為:

兩個數據框中如果列名不同的情況下,我們可以通過指定letf_on 和right_on兩個參數把數據連接在一起

print(pd.merge(data3,data4,left_on='level1',right_on='level2',how='left'))

結果為:

其他詳細參數說明

重疊數據合并

有時候我們會遇到重疊數據需要進行合并處理,此時可以用comebine_first函數。

 data3 = pd.DataFrame({'level':['a','b','c','d'],
                'numeber1':[1,3,5,np.nan]})
 data4=pd.DataFrame({'level':['a','b','c','e'],
                'numeber2':[2,np.nan,6,10]})
 print(data3.combine_first(data4))

結果為:

可以看到相同標簽下的內容優先顯示data3的內容,如果一個數據框中的某一個數據是缺失的,此時另外一個數據框中的元素就會補上

這里的用法類似于np.where(isnull(a),b,a)

數據重塑和軸向旋轉

這個內容我們在上一篇pandas文章有提到過。數據重塑主要使用reshape函數,旋轉主要使用unstack和stack兩個函數。

data=pd.DataFrame(np.arange(12).reshape(3,4),
              columns=['a','b','c','d'],
              index=['wang','li','zhang'])
print(data)

結果為:

print(data.unstack())

結果為:

數據轉換

刪除重復行數據

data=pd.DataFrame({'a':[1,3,3,4],
              'b':[1,3,3,5]})
print(data)

結果為:

print(data.duplicated())

結果為:

可以看出第三行是重復第二行的數據所以,顯示結果為True

另外用drop_duplicates方法可以去除重復行

print(data.drop_duplicates())

結果為:

替換值

除了使用我們上一篇文章中提到的fillna的方法外,還可以用replace方法,而且更簡單快捷

data=pd.DataFrame({'a':[1,3,3,4],
              'b':[1,3,3,5]})
print(data.replace(1,2))

結果為:

多個數據一起換

print(data.replace([1,4],np.nan))

數據分段

data=[11,15,18,20,25,26,27,24]
bins=[15,20,25]
print(data)
print(pd.cut(data,bins))

結果為:

[11, 15, 18, 20, 25, 26, 27, 24][NaN, NaN, (15, 20], (15, 20], (20, 25], NaN, NaN, (20, 25]]

Categories (2, object): [(15, 20] < (20, 25]]

可以看出分段后的結果,不在分段內的數據顯示為na值,其他則顯示數據所在的分段。

print(pd.cut(data,bins).labels)

結果為:

[-1 -1 0 0 1 -1 -1 1]

顯示所在分段排序標簽

print(pd.cut(data,bins).levels)

結果為:

Index([‘(15, 20]’, ‘(20, 25]’], dtype=’object’)

顯示所以分段標簽

print(value_counts(pd.cut(data,bins)))

結果為:

顯示每個分段值得個數

此外還有一個qcut的函數可以對數據進行4分位切割,用法和cut類似。

排列和采樣

我們知道排序的方法有好幾個,比如sort,order,rank等函數都能對數據進行排序

現在要說的這個是對數據進行隨機排序(permutation)

data=np.random.permutation(5)
print(data)

結果為:

[1 0 4 2 3]

這里的peemutation函數對0-4的數據進行隨機排序的結果。

也可以對數據進行采樣

df=pd.DataFrame(np.arange(12).reshape(4,3))
samp=np.random.permutation(3)
print(df)

結果為:

print(samp)

結果為:

[1 0 2]

print(df.take(samp))

結果為:

這里使用take的結果是,按照samp的順序從df中提取樣本。

 

來自:http://python.jobbole.com/87346/

 

 本文由用戶 CarBarkly 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!