目錄
- 資料篩選
- 給資料打标簽
- 行的查改增删
- 檢視行
- 索引
- 分片
- iloc
- 修改行
- 情況一
- 情況二
- 新增行
- 删除行
- 資料的分組
資料篩選
沿用上一篇的資料:
将每一行四個季度進行求和
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 的 cut() 方法常用于資料的分類和打标簽。
比如:
pd.cut(df['總和'], bins=[0, 1000, 2000, 3000], labels=['不合格', '良好', '優秀'])
上面這段代碼的意思是,按照 (0, 1000]、(1000, 2000] 和 (2000, 3000] 的數值區間,把資料分為不合格、良好和優秀三組。
參數詳解:
- 第一個參數是要分類的列;
- 第二個參數
是分類的方式,即分類區間,預設是左開右閉,設定 bins=[0, 1000, 2000, 3000],那對應的分類區間就是 (0, 1000]、(1000, 2000] 和 (2000, 3000]。如果你想要左閉右開的方式,可以再添加一個參數 right=False。bins
- 參數
分别對應了這三組的标簽名。即 (0, 1000] 表示不合格,(1000, 2000] 表示良好,(2000, 3000] 表示優秀。labels
記得打完标簽後一定要新增一個列放進去,要不是顯示不出來的。
例如:
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
如果你在建構表格時像下面這樣單獨設定了索引,同樣也可以用對應的索引值來擷取表格行的資料:
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, '辣條'])
分片
例如:
# 行分片
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
多條件篩選的寫法與前面一樣
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
情況二
而第二種情況則是按清單順序修改對應的列:
# 按順序修改成 1 2 3 4
df.loc[0] = [1, 2, 3, 4]
print(df)
辣條 面包 可樂 烤腸
0 1 2 3 4
1 20 3 13 6
當然你也可以使用例如 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
注意:在新增行時,是不能使用 iloc 傳入索引的.(是以在新增行的時候就不要使用iloc了)
删除行
删除行和删除列一樣,都是使用 drop() 方法。删除列的使用傳入了 axis=1 表示對列進行删除,axis 預設為 0,是以删除行時省略 axis 參數即可。
df.drop(0, inplace=True) # 删除第一行
print(df)
# 或者 print(df.drop(0))
資料的分組
pandas 提供了 groupby() 方法用于資料的分組,第一個參數用于指定按哪一列進行分組。
例如現在我們有資料:
我們要按團隊分組就可以像下面這樣寫:
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