天天看點

資料分析 -- Pandas②

目錄

  • ​​資料篩選​​
  • ​​給資料打标簽​​
  • ​​行的查改增删​​
  • ​​檢視行​​
  • ​​索引​​
  • ​​分片​​
  • ​​iloc​​
  • ​​修改行​​
  • ​​情況一​​
  • ​​情況二​​
  • ​​新增行​​
  • ​​删除行​​
  • ​​資料的分組​​

資料篩選

沿用上一篇的資料:

資料分析 -- Pandas②

将每一行四個季度進行求和

df['總和'] = df['第一季度'] + df['第二季度'] + df['第三季度'] + df['第四季度']      

若此時我們想要篩選出那些總銷售額低于平均值的銷售員:

df[df['總和'] < df['總和'].mean()]      

這和 NumPy 中數組的布爾索引是一樣的,中括号裡是篩選條件,傳回值是所有符合條件的資料。df[‘總和’] < df[‘總和’].mean() 的結果如下:

0     False
1     False
2     False
3      True
4     False
5      True
6     False
7     False
8     False
9      True
10    False
11     True
12     True
13    False
14     True
15    False
16    False
17     True
18     True
19     True
Name: 總和, dtype: bool      

符合條件的為 True,不符合條件的為 False。最終 df[df[‘總和’] < df[‘總和’].mean()] 會去除所有結果為 False 的行,隻保留下結果為 True 的。最終的傳回結果如下:

銷售員 團隊    第一季度   第二季度   第三季度    第四季度  總和
3     李四    D      2104      3939      3285      3461  12789
5     趙六    B      2545      3747      2232      3472  11996
9     鄭十    B      4935      2617      2424      3833  13809
11  蔣十二    D      4509      3673      4717      3489  16388
12  畢十三    A      4873      5403      3889      2567  16732
14  秦十五    C      1501      2238      1272      2265   7276
17  沈十八    B      2733      2649      3402      3164  11948
18  韓十九    C      1519      1553      1411      2091   6574
19  楊二十    D      3268      5090      3898      4180  16436      

我們也可以寫多個條件進行判斷,在 pandas 中要表示同時滿足,各條件之間要用 ​

​&​

​​ 符号連接配接。如果要表示隻要滿足之一,各條件之間要用 ​

​|​

​ 符号來連接配接。并且每個條件要用括号括起來,舉個例子:

# 篩選出總和大于 10000 且小于 12000 的
df[(df['總和'] > 10000) & (df['總和'] < 12000)]

# 篩選出總和小于 5000 或大于 12000 的
df[(df['總和'] < 5000) | (df['總和'] > 12000)]      
資料分析 -- Pandas②

給資料打标簽

pandas 的 cut() 方法常用于資料的分類和打标簽。

比如:

pd.cut(df['總和'], bins=[0, 1000, 2000, 3000], labels=['不合格', '良好', '優秀'])      

上面這段代碼的意思是,按照 (0, 1000]、(1000, 2000] 和 (2000, 3000] 的數值區間,把資料分為不合格、良好和優秀三組。

參數詳解:

  • 第一個參數是要分類的列;
  • 第二個參數​

    ​bins​

    ​ 是分類的方式,即分類區間,預設是左開右閉,設定 bins=[0, 1000, 2000, 3000],那對應的分類區間就是 (0, 1000]、(1000, 2000] 和 (2000, 3000]。如果你想要左閉右開的方式,可以再添加一個參數 right=False。
  • 參數​

    ​labels​

    ​ 分别對應了這三組的标簽名。即 (0, 1000] 表示不合格,(1000, 2000] 表示良好,(2000, 3000] 表示優秀。
資料分析 -- Pandas②

記得打完标簽後一定要新增一個列放進去,要不是顯示不出來的。

例如:

df['績效'] = pd.cut(df['總和'], bins=[0, 1000, 2000, 3000], labels=['不合格', '良好', '優秀'])      

行的查改增删

首先,我們用 DataFrame 建構一個簡單的表格:

import pandas as pd

df = pd.DataFrame({'辣條': [14, 20], '面包': [7, 3], '可樂': [8, 13], '烤腸': [10, 6]})      

然後我們能得到下面這樣的表格:

辣條   面包  可樂   烤腸
0    14     7     8    10
1    20     3    13     6      

列是通過列名來擷取的,同理,行是通過最左邊的索引來擷取。在不指定的情況下,索引值預設從 0 開始依次遞增。我們可以使用 ​

​loc​

​ 基于索引進行表格行的查改增删。

檢視行

索引

以檢視上面表格中第一行的資料為例,代碼如下:

print(df.loc[0])      
注意,loc 并不是一個方法,而是類似于字典。是以我們使用的是 [] 而不是 ()

運作結果:

辣條    14
面包     7
可樂     8
烤腸    10
Name: 0, dtype: int64      
資料分析 -- Pandas②

如果你在建構表格時像下面這樣單獨設定了索引,同樣也可以用對應的索引值來擷取表格行的資料:

import pandas as pd

data = {
  '辣條': [14, 20],
  '面包': [7, 3],
  '可樂': [8, 13],
  '烤腸': [10, 6]
}
df = pd.DataFrame(data, index=['2020-01-01', '2020-01-02'])
print(df.loc['2020-01-01'])      

上面的代碼中,表格的索引是日期。我們檢視對應日期的資料時就需要将對應的日期作為索引,運作結果如下:

辣條    14
面包     7
可樂     8
烤腸    10
Name: 2020-01-01, dtype: int64      

除了第一個參數索引外,還支援第二個參數列名。即同時基于行和列擷取指定的資料,比如:

print(df.loc[0, '辣條'])      
資料分析 -- Pandas②

分片

例如:

# 行分片
print(df.loc[0:1, '辣條'])

# 列分片
print(df.loc[0, '辣條':'可樂'])

# 同時分片
print(df.loc[0:1, '辣條':'可樂'])      
需要注意的是,這裡的分片和 Python 中清單的分片不太一樣,這裡的分片結果是前後都包含的,而清單分片隻包含前面不包含後面。

運作結果:

0    14
1    20
Name: 辣條, dtype: int64

辣條    14
面包     7
可樂     8
Name: 0, dtype: int64

    辣條   面包  可樂
0    14     7     8
1    20     3    13      

你也可以通過省略冒号前後的内容來實作全選,例如:df.loc[:, ‘辣條’:‘可樂’],這一點和清單的分片是一樣的。

loc 同時也支援布爾索引來進行資料的篩選,比如擷取辣條銷量大于 15 的資料:

df.loc[df['辣條'] > 15]      

上面的寫法等價于 df[df[‘辣條’] > 15],不同之處在于 loc 還能通過第二個參數篩選出隻想檢視的列,比如:

print(df.loc[df['辣條'] > 15, ['辣條', '面包']])      

結果:

辣條   面包
1    20     3      
資料分析 -- Pandas②

多條件篩選的寫法與前面一樣

iloc

除了比較常用的 loc 之外,我們還能使用 iloc。用法和 loc 一樣,差別在于 loc 使用的參數是索引,而 iloc 的參數是位置,即第幾行。是以,在不指定索引的情況下,loc 和 iloc 的效果是一樣的。但當單獨指定了索引,我們想擷取前 3 行資料時可以像下面這樣寫:

import pandas as pd

data = {
  '辣條': [14, 20, 12, 15, 17],
  '面包': [7, 3, 8, 3, 9],
  '可樂': [8, 13, 23, 12, 19],
  '烤腸': [10, 6, 21, 24, 18]
}
df = pd.DataFrame(data, index=['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05'])
print(df.iloc[:3])  # :3 表示 0、1、2 前三行      

結果:

2020-01-01    14     7     8    10
2020-01-02    20     3    13     6
2020-01-03    12     8    23    21      

注意:索引變成了日期,想要按位置擷取資料的話隻能使用 iloc,這時如果使用 df.loc[:3] 将會報錯。

注意,iloc 的分片和 Python 的清單分片一樣,要和 loc 的分片規則區分開來。

修改行

假設某行的資料有問題,我們需要進行修正。修改起來同樣也很簡單,直接指派即可。這裡分為兩種情況:

  • 指派為一個數字;
  • 指派為長度和列數相等清單。

情況一

對于第一種情況,這一行所有的資料都會被修改成同樣的數字:

df.loc[0] = 1  # 第一行都改成 1
print(df)      

結果:

辣條   面包  可樂   烤腸
0     1     1     1     1
1    20     3    13     6      
資料分析 -- Pandas②

情況二

而第二種情況則是按清單順序修改對應的列:

# 按順序修改成 1 2 3 4
df.loc[0] = [1, 2, 3, 4]
print(df)      
辣條   面包  可樂   烤腸
0     1     2     3     4
1    20     3    13     6      
資料分析 -- Pandas②

當然你也可以使用例如 df.loc[0, ‘辣條’] = 23 定位到行和列來修改特定的資料。

新增行

行和列的基本操作都是類似的,隻是具體的方式不同。新增行也是如此,隻需傳入表格中不存在的索引即可。

例如:

# 添加第三行,全為 1
df.loc[2] = 1
# 添加第四行,分别為 1 2 3 4
df.loc[3] = [1, 2, 3, 4]
print(df)      

結果:

辣條   面包  可樂   烤腸
0    14     7     8    10
1    20     3    13     6
2     1     1     1     1
3     1     2     3     4      
資料分析 -- Pandas②
注意:在新增行時,是不能使用 iloc 傳入索引的.(是以在新增行的時候就不要使用iloc了)

删除行

删除行和删除列一樣,都是使用 drop() 方法。删除列的使用傳入了 axis=1 表示對列進行删除,axis 預設為 0,是以删除行時省略 axis 參數即可。

df.drop(0, inplace=True)  # 删除第一行
print(df)
# 或者 print(df.drop(0))      
資料分析 -- Pandas②

資料的分組

pandas 提供了 groupby() 方法用于資料的分組,第一個參數用于指定按哪一列進行分組。

例如現在我們有資料:

資料分析 -- Pandas②

我們要按團隊分組就可以像下面這樣寫:

df.groupby('團隊')      

但僅僅進行分組是沒有結果的(實際上它傳回的是一個分組後的對象,你不能直接列印出來看),還需要調用 max()、min()、mean()、sum() 等方法進行分組後的計算。

就像:

print(df.groupby('團隊').sum())      
第一季度  第二季度   第三季度   第四季度     總和
團隊                                                
A        25720     28139     24512     22206  100577
B        18059     17369     19791     19532   74751
C        14770     17239     19409     20353   71771
D        20834     22298     22474     23603   89209