1. 程式人生 > >DataFrame基本操作 <三> 計算名次,移除重復數據,數據替換,劃分區間,分組統計(變成類)

DataFrame基本操作 <三> 計算名次,移除重復數據,數據替換,劃分區間,分組統計(變成類)

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基本操作 <三> 計算名次,移除重復數據,數據替換,劃分區間,分組統計(變成類)