DataFrame基本操作 <三> 計算名次,移除重復數據,數據替換,劃分區間,分組統計(變成類)
阿新 • • 發佈:2018-06-06
pla cti 特定 但是 afr bin 條件 IV 用法
生成一個實例
df5 = DataFrame({‘b‘: [4.3, 7, -3, 2], ‘a‘: [0, 1, 0, 1], ‘c‘: [-2, 5, 8, -2.5]}) print(df5)
運行結果
b a c
0 4.3 0 -2.0
1 7.0 1 5.0
2 -3.0 0 8.0
3 2.0 1 -2.5
計算名次
print(df5.rank() ) # 按行計算名次 print(df5.rank(axis=1)) # 按列計算名次 #這有意思了,這是計算名次,顯示的結果是名次,不是裏邊值的內容,只能用在f類型,df5.rank()是垂直方向比大小,豎著四個誰最大,顯示的數字最大,最大4,最小1#df5.rank(axis=1)就是水平方向比大小,三個 數字之間比,最大3,最小1
運行結果
b a c 0 4.3 0 -2.0 1 7.0 1 5.0 2 -3.0 0 8.0 3 2.0 1 -2.5 #原本 b a c 0 3.0 1.5 2.0 1 4.0 3.5 3.0 2 1.0 1.5 4.0 3 2.0 3.5 1.0 #豎著比,也就是垂直比,4個值 b a c 0 3.0 2.0 1.0 1 3.0 1.0 2.0 2 1.0 2.0 3.0 3 3.0 2.0 1.0 #水平比,3個值
重新生成一個實例,觀察這個實例的生成方法
df6 = pd.DataFrame({‘k1‘: [‘one‘, ‘two‘] * 3 + [‘two‘], ‘k2‘: [1, 1, 2, 3, 3, 4, 4]}) print(df6) df7 = pd.DataFrame({‘k1‘: [‘one‘, ‘two‘] * 3 + [‘two‘], ‘k2‘: list(‘1123344‘)}) print(df6) print(df7) #以上兩種方法,效果一樣,但是結果不一樣。。怎麽理解那,上邊的k2是int,下邊的k2是str,我一開始錯誤的以為一樣了,現在我們拿df6來舉例
運行結果
k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4 #就寫一個行了
移除重復的數據
print(df6.drop_duplicates()) # 移除重復的行 print(df6.drop_duplicates([‘k1‘])) # 移除某列有重復的行 print(df6[::-1].drop_duplicates([‘k1‘])) # 反向移除 #這裏講究了,第一個是垂直移除,移除的條件是同時滿足k1,k2的值都相等 #第二個是k1列只有重復的都移除 #第三個是垂直反向開始
運行結果
k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4 #原版 k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 #移除了重復的行‘two 4’ k1 k2 0 one 1 1 two 1 #k1 去掉重復的 k1 k2 6 two 4 4 one 3 #反向開始 去掉k1重復的
數據替換
這裏是根據‘name’(cols)替換的。
我覺得這個方法挺重要的以後能用的上,挺好的。
i={k1[0]:123,k1[1:456}
df[‘name].map(i) #
k3 = {‘one‘: 2001, ‘two‘: 2002} df6[‘k3‘] = df6[‘k1‘].map(k3) # 根據已有的鍵值做轉換 print(df6[‘k3‘]) print(df6) print(df6[‘k2‘].replace([2, 4], 0)) # 替換特定的值 print(df6) #第一個,k1裏邊有‘one’,‘two’,創建k3,用map方法 #第二個就是字面意思,k2裏邊的2,4替換成0
運行結果
k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4 #原版 0 2001 1 2002 2 2001 3 2002 4 2001 5 2002 6 2002 Name: k3, dtype: int64 #k3的數據 k1 k2 k3 0 one 1 2001 1 two 1 2002 2 one 2 2001 3 two 3 2002 4 one 3 2001 5 two 4 2002 6 two 4 2002 #現版 0 1 1 1 2 0 3 3 4 3 5 0 6 0 Name: k2, dtype: int64 #替換後的k2 k1 k2 k3 0 one 1 2001 1 two 1 2002 2 one 2 2001 3 two 3 2002 4 one 3 2001 5 two 4 2002 6 two 4 2002 #請註意!!!這裏如果你打印df6,還是上一版,k2的新值沒有賦過來,也就是replace返回的結果是單獨的。
那麽如何將新產生的k2賦值給df6
a=df6[‘k2‘].replace([2, 4], 0) df6[‘k2‘]=a print(df6)
運行結果
k1 k2 k3 0 one 1 2001 1 two 1 2002 2 one 0 2001 3 two 3 2002 4 one 3 2001 5 two 0 2002 6 two 0 2002 完美
劃分區間
對零散是數據劃分區間
bins = pd.cut(df6[‘k2‘], [0, 2, 4]) # 對離散數據劃分區間,cut用法,劃分兩個區間,0~2,2~4 print(bins) df6[‘k2‘]=bins print(df6)
運行結果
k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4 #原版 0 (0, 2] 1 (0, 2] 2 (0, 2] 3 (2, 4] 4 (2, 4] 5 (2, 4] 6 (2, 4] Name: k2, dtype: category Categories (2, interval[int64]): [(0, 2] < (2, 4]] #這裏區間的意思是0~2之間的劃為一塊,2~4之間的劃為一塊 k1 k2 0 one (0, 2] #1 1 two (0, 2] #1 2 one (0, 2] #2 3 two (2, 4] #3 4 one (2, 4] #3 5 two (2, 4] #4 6 two (2, 4] #4
同理,再來一個對比
bins = pd.cut(df6[‘k2‘], [0, 3, 4]) # 對離散數據劃分區間,cut用法,劃分兩個區間,0~3,3~4 print(bins) df6[‘k2‘]=bins print(df6)
運行結果
k1 k2 0 one (0, 3] 1 two (0, 3] 2 one (0, 3] 3 two (0, 3] 4 one (0, 3] 5 two (3, 4] 6 two (3, 4]
按區間對離散數值進行統計
bins = pd.cut(df6[‘k2‘], [0, 2, 4]) # 對離散數據劃分區間,cut用法,劃分兩個區間,0~2,2~4 print(pd.value_counts(bins)) # 按區間對離散值統計
運行結果
(2, 4] 4 (0, 2] 3 Name: k2, dtype: int64
生成新的‘name’,加上分類信息
bins = pd.cut(df6[‘k2‘], [0, 2, 4]) # 對離散數據劃分區間,cut用法,劃分兩個區間,0~2,2~4 df6[‘k3‘] = bins # 在原有dataframe上直接加上分類信息,這裏生成了k3 print(df6)
運行結果
k1 k2 k3 0 one 1 (0, 2] 1 two 1 (0, 2] 2 one 2 (0, 2] 3 two 3 (2, 4] 4 one 3 (2, 4] 5 two 4 (2, 4] 6 two 4 (2, 4]
分組統計
group_6=df6.groupby([df6[‘k3‘]]) # 分組,好像創建了一個類。。。。這裏如果是k2或者k1,無法使用統計平均數,mean是個類的方法。 print(group_6.sum()) # 統計 求和 print(group_6.mean()) # 統計 平均數 這個平均數是k2的!!!這就是個類,沒錯就是把整個df6變成一個類了
運行結果
k1 k2 k3 0 one 1 (0, 2] 1 two 1 (0, 2] 2 one 2 (0, 2] 3 two 3 (2, 4] 4 one 3 (2, 4] 5 two 4 (2, 4] 6 two 4 (2, 4] k2 k3 (0, 2] 4 (2, 4] 14 k2 k3 (0, 2] 1.333333 (2, 4] 3.500000
# group_6.apply(function_name) # 對分組對象應用自定義函數 # 練習: 對df6按k3分組後,求每組中k2列的最大值和最小值 # 要求利用 apply 函數
回家再做
DataFrame基本操作 <三> 計算名次,移除重復數據,數據替換,劃分區間,分組統計(變成類)