
深入掌握Pandas技巧
1. 標籤選取: .loc[index, label]
data = {
"Name": ["Alice", "Bob", None, "Dora"],
"Age": [30, None, 28, None],
"Score": [85, 90, 88, 70]
}
df = pd.DataFrame(data)
df.loc[0, "Name"] # 第0列的Name欄
df.loc[:, ["Name", "Age"]] # 所有列的這兩欄
# 輸出
Alice
Name Age
0 Alice 30.0
1 Bob NaN
2 None 28.0
3 Dora NaN
說明
- loc[]是利用index+label進行取值
- ":"代表所有
2. 位置選取: .iloc[row, col]
df.iloc[1, 2] # 第1列第2欄的值
df.iloc[1:3] # 第1~2列
# 輸出
90
Name Age Score
1 Bob NaN 90
2 None 28.0 88
說明
- python中的index取值不包含最後一位
- 如string[0~3]: 代表取字串[0, 1, 2]字元
3. 新增欄位運算
df["Score2x"] = df["Score"] * 2
print(df)
# 輸出
Name Age Score Score2x
0 Alice 30.0 85 170
1 Bob NaN 90 180
2 None 28.0 88 176
3 Dora NaN 70 140
說明
- 要在df中新增欄位只需要直接賦值即可
4. 欄位重新命名: .rename()
df.rename(columns={"Name": "Student_Name"}, inplace=True)
print(df)
# 輸出
Student_Name Age Score
0 Alice 30.0 85
1 Bob NaN 90
2 None 28.0 88
3 Dora NaN 70
5. 欄位順序調整
df = df[["Name", "Score", "Age"]]
print(df)
# 輸出
Name Score Age
0 Alice 85 30.0
1 Bob 90 NaN
2 None 88 28.0
3 Dora 70 NaN
6. 條件篩選: .query()
df.query("Age > 21 and Score > 70")
df[(df['Age'] > 21) & (df['Score'] > 70)]
# 輸出
Name Age Score
0 Alice 30.0 85
2 None 28.0 88
說明
- Pandas中進行條件篩選非常容易,也可以使用SQL類似的語法,有興趣的人可以自行查詢
- 上述兩個用法是相同的
強大的條件操作: df.loc[條件, 欄位]
1. 條件篩選多欄
data = {
"Name": ["Alice", "Bob", "Cindy", "Dora"],
"Age": [30, 35, 28, 44],
"Score": [85, 90, 88, 70]
}
df = pd.DataFrame(data)
df.loc[df["Age"] > 30, ["Name", "Age"]]
# 輸出
Name Age
1 Bob 35
3 Dora 44
2. 多重條件(AND/OR)
# AND 條件
df.loc[(df["Age"] > 30) & (df["Score"] > 80)]
# OR 條件
df.loc[(df["Age"] > 30) | (df["Score"] > 80)]
# 輸出
Name Age Score
1 Bob 35 90
Name Age Score
0 Alice 30 85
1 Bob 35 90
2 Cindy 28 88
3 Dora 44 70
3. 條件更新值(SQL的UPDATE): 非常重要!💡
df['Passed'] = True
# 將 Score < 60 的 Passed 欄位設為 False
df.loc[df["Score"] < 60, "Passed"] = False
# 輸出
Name Age Score Passed
0 Alice 30 45 False
1 Bob 35 90 True
2 Cindy 28 88 True
3 Dora 44 70 True
說明
- 此用法非常非常重要!!!
- 可直接修改df中的值
- 但是要小心使用
- 修改前須將原本的df複製起來避免遺失
- 如: original_df = df.copy()
4. isin()判斷多值
# 選出 Name 為 'Tom' 或 'Jerry' 的列
df["Name"].isin(["Tom", "Jerry"])
# 輸出
0 False
1 False
2 False
3 False
Name: Name, dtype: bool
說明
- 可將此篩選條件放入df[條件]中取值
5. str.contains做字串模糊篩選
# 篩選 Name 欄位中包含 "ar" 的資料
df.loc[df["Name"].str.contains("ar")]
# 輸出
Empty
說明
- 由於條件沒有符合的,因此取不到值
6. 條件替換多欄位
# 若 Score < 60,則將 Score 設為 60,Passed 設為 False
df['Passed'] = True
df.loc[df["Score"] < 60, ["Score", "Passed"]] = [60, False]
# 輸出
Name Age Score Passed
0 Alice 30 60 False
1 Bob 35 90 True
2 Cindy 28 88 True
3 Dora 44 70 True
說明
- 同用法3
7. 用query()代替loc[]
df.query("Age > 30 and Score < 90")
# 輸出
Name Age Score Passed
3 Dora 44 70 True
搭配自訂函數: apply() map() lambda
1. lambda: 匿名函式
lambda 是 Python 中的「匿名函式」,常搭配 apply() 或 map() 對資料進行即時轉換。
lambda 參數: 運算式
f = lambda x: x * 2
print(f(5)) # 👉 10
說明
- lambda的作用在於快速建立簡單的函數
2. map(): 只能用於"Series"單欄位的轉換
適合場景: 對某一欄的每個值做簡單轉換
data = {
"Name": ["Alice", "Bob", "Cindy", "Dora"],
"Age": [30, 35, 28, 44],
"Math": [45, 90, 88, 70],
"Gender": ["F", "M", "F", "F"],
"English": [33, 22, 66, 77],
}
df = pd.DataFrame(data)
# 將Name轉為大寫
df['Name'] = df['Name'].map(lambda x: x.upper())
# 字詞替換
gender_map = {'M': 'Male', 'F': 'Female'}
df['Gender'] = df['Gender'].map(gender_map)
print(df)
# 輸出
Name Age Score Gender Passed
0 ALICE 30 45 Female True
1 BOB 35 90 Male True
2 CINDY 28 88 Female True
3 DORA 44 70 Female True
說明
- 每次一欄一欄處理的話是合用map()搭配lambda
3. apply(): 可用於"Series"或整個"DataFrame"
data = {
"Name": ["Alice", "Bob", "Cindy", "Dora"],
"Age": [30, 35, 28, 44],
"Math": [45, 90, 88, 70],
"Gender": ["F", "M", "F", "F"],
"English": [33, 22, 66, 77],
}
df = pd.DataFrame(data)
# 數學往上調5分
df['Math'] = df['Math'].apply(lambda x: x + 5)
# 每列相加總分
df['Total'] = df.apply(lambda row: row['Math'] + row['English'], axis=1)
print(df)
# 輸出
Name Age Math Gender English Total
0 Alice 30 50 F 33 83
1 Bob 35 95 M 22 117
2 Cindy 28 93 F 66 159
3 Dora 44 75 F 77 152
說明
- apply()使用時要多注意axis=0 / axis=1
4. 差異比較表

5. 💡範例: apply() + if條件
data = {
"Name": ["Alice", "Bob", "Cindy", "Dora"],
"Age": [30, 35, 28, 44],
"Score": [45, 90, 88, 70],
"Gender": ["F", "M", "F", "F"],
"English": [33, 22, 66, 77],
}
df = pd.DataFrame(data)
df["Grade"] = df["Score"].apply(lambda x: "A" if x > 80 else "B")
print(df)
# 輸出
Name Age Score Gender English Grade
0 Alice 30 45 F 33 B
1 Bob 35 90 M 22 A
2 Cindy 28 88 F 66 A
3 Dora 44 70 F 77 B