Pandas 作為 Python 資料科學領域的核心工具,提供了豐富的資料操作功能。理解並掌握這些技巧,對於提升資料處理效率至關重要。本文將介紹如何使用 Pandas 進行資料複製以確保資料獨立性,如何運用字串方法處理文字資料,以及如何有效地清理、轉換和過濾資料,最後示範如何處理 CSV 檔案中的姓名欄位分割。這些技巧將幫助你更好地運用 Pandas 進行資料分析和處理。
資料複製與獨立性
在資料操作中,經常需要建立原始資料的複製,以便進行獨立的修改或分析,而不影響原始資料。在 Pandas 中,Series 和 DataFrame 物件都提供了 copy()
方法,用於建立一個獨立的複製。
Series 物件的複製
當你需要複製一個 Series 物件時,可以直接呼叫 copy()
方法。這個方法會傳回一個新的 Series 物件,該物件與原始 Series 物件完全獨立。任何對新 Series 物件的修改都不會影響原始 Series 物件。
import pandas as pd
# 建立一個 Series 物件
myseries = pd.Series({
'Divya': 34,
'Mintoo': 37,
'Yathartha': 35,
'Nilesh': 43,
'Priyanka': 30,
'Saurabh': 40
})
# 複製 Series 物件
myseries_copy = myseries.copy()
# 修改複製的 Series 物件
myseries_copy['Priyanka'] = 'Upper limit'
myseries_copy['Saurabh'] = 'Upper limit'
print("原始 Series 物件:")
print(myseries)
print("\n複製的 Series 物件:")
print(myseries_copy)
DataFrame 物件的複製
與 Series 物件類別似,DataFrame 也提供了 copy()
方法,用於建立一個獨立的複製。這對於需要對資料進行多種分析或修改時尤其有用,因為你可以在不影響原始資料的情況下進行任意修改。
# 建立一個 DataFrame 物件
mydf = pd.DataFrame({
'Name': ['Divya', 'Mintoo', 'Yathartha', 'Nilesh', 'Priyanka', 'Saurabh'],
'Age': [34, 37, 35, 43, 30, 40],
'Country': ['India', 'Australia', 'India', 'UK', 'USA', 'Italy'],
'Salary': [10000, 20000, 30000, 40000, 50000, 60000]
})
# 複製 DataFrame 物件
mydf_copy = mydf.copy()
# 修改複製的 DataFrame 物件
mydf_copy.loc[4, 'Salary'] = 'Upper limit'
mydf_copy.loc[5, 'Salary'] = 'Upper limit'
print("原始 DataFrame 物件:")
print(mydf)
print("\n複製的 DataFrame 物件:")
print(mydf_copy)
圖表翻譯:資料複製流程
flowchart TD A[原始資料] --> B[複製資料] B --> C[修改複製資料] C --> D[確認獨立性] D --> E[傳回結果]
圖表翻譯:
上述流程圖描述了資料複製的過程。首先從原始資料開始,然後建立一個複製。接下來,你可以對複製的資料進行任意修改,而不會影響原始資料。最後,確認修改後的複製資料與原始資料之間的獨立性,並傳回結果。這個過程保證了資料的安全和可靠性,尤其是在進行多種分析或修改時。
處理文字資料
在 Pandas 中,我們可以像移除空格、轉換為所需的空格等一樣處理文字資料。就像我們在字串方法基礎中學習的方法一樣,這些方法也可以在這裡使用。例如 upper、title、lower、replace、lstrip、rstrip、strip 和 len 等方法都可以使用。在使用這些方法時,我們需要加上 str 字首,如下面的例子所示。
範例
import pandas as pd
# 讀取 CSV 檔案
df = pd.read_csv('text_eg.csv')
# 對索引進行排序
df.sort_index(inplace=True)
# 列印原始資料
print(df)
print('-'*50)
# 將所有名稱轉換為大寫
df['myname'] = df['myname'].str.upper()
# 列印轉換後的資料
print(df)
print('-'*50)
# 將薪水欄位中的 '$' 替換為 'Rs'
df['mysalary'] = df['mysalary'].str.replace('$', 'Rs')
# 列印替換後的資料
print(df)
print('-'*50)
# 將名稱欄位中的中間空格替換為底線符號
df['myname'] = df['myname'].str.replace(' ', '_')
# 列印替換後的資料
print(df)
內容解密:
在上面的例子中,我們使用了 Pandas 的 str 方法來處理文字資料。首先,我們將所有名稱轉換為大寫,然後替換薪水欄位中的 ‘$’ 為 ‘Rs’,最後將名稱欄位中的中間空格替換為底線符號。這些操作都使用了 str 字首來指定要操作的欄位。
圖表翻譯:
flowchart TD A[讀取 CSV 檔案] --> B[排序索引] B --> C[轉換名稱為大寫] C --> D[替換薪水欄位中的 '$' 為 'Rs'] D --> E[替換名稱欄位中的中間空格為底線符號] E --> F[列印轉換後的資料]
這個流程圖展示了我們對文字資料進行的各種操作,從讀取 CSV 檔案開始,到最後列印轉換後的資料。每個步驟都使用了 Pandas 的 str 方法來處理文字資料。
資料前處理:清理和轉換
資料前處理是資料分析中的重要步驟,涉及清理和轉換原始資料以使其適合分析。在這個例子中,我們將使用Python的Pandas函式庫來演示如何清理和轉換資料。
清理名稱欄位
首先,我們需要清理myname
欄位中的資料。這涉及移除多餘的空白字元和替換特殊字元。以下是如何做到的範例:
mypd_dataframe['myname'] = mypd_dataframe['myname'].str.strip().str.replace('\n', '_')
這行程式碼使用str.strip()
方法移除myname
欄位中的多餘空白字元,然後使用str.replace()
方法替換特殊字元\n
為底線 _
。
轉換薪水欄位
接下來,我們需要轉換mysalary
欄位中的資料為浮點數型別,並將其除以玄貓’K’單位。以下是如何做到的範例:
mypd_dataframe['mysalary'] = (mypd_dataframe['mysalary'].str.replace('Rs', '').astype(float) / 1000).astype(str) + 'K'
這行程式碼使用str.replace()
方法移除mysalary
欄位中的字元串Rs
,然後使用astype(float)
方法將欄位轉換為浮點數型別。接著,將薪水除以1000並使用astype(str)
方法將結果轉換回字元串。最後,追加字元串’K’到結果中。
輸出結果
執行上述程式碼後,輸出結果如下:
myname mysalary mystaffno
0 Divya_Sharma 10K 601490
1 Yathartha_Chandrakar 20K 601491
2 Saurabh_Chandrakar 30K 601492
3 Nilesh_Bahadure 40K 601493
4 Priyanka_Chandrakar 50K 601494
--------------------------------------------------
內容解密:
在這個例子中,我們使用Pandas函式庫來清理和轉換資料。首先,我們使用str.strip()
方法移除多餘的空白字元,然後使用str.replace()
方法替換特殊字元。接著,我們使用astype(float)
方法將欄位轉換為浮點數型別,並將其除以玄貓’K’單位。最後,追加字元串’K’到結果中。
圖表翻譯:
以下是資料前處理流程的Mermaid圖表:
flowchart TD A[原始資料] --> B[清理名稱欄位] B --> C[轉換薪水欄位] C --> D[輸出結果]
圖表翻譯:
這個圖表展示了資料前處理的流程。首先,原始資料被清理和轉換,然後輸出結果。
員薪水料管理系統
在現代企業中,員薪水料管理是一個非常重要的工作。它涉及到員工的基本資訊、薪水、職位等多方面的資料。下面,我們將透過一個簡單的例子來展示如何設計和實作一個員薪水料管理系統。
需求分析
首先,我們需要了解系統的需求。假設我們有一家公司,需要管理員工的姓名、薪水和員工編號。系統應該能夠新增、刪除和查詢員薪水料。
資料結構設計
為了滿足需求,我們可以設計如下資料結構:
- 員工編號(staff_no):唯一識別每個員工的編號。
- 姓名(name):員工的全名。
- 薪水(salary):員工的月薪。
範例資料
以下是幾條範例資料:
員工編號 | 姓名 | 薪水 |
---|---|---|
601490 | Divya Sharma | Rs10000 |
601491 | Yathartha Chandrakar | Rs20000 |
601492 | Saurabh Chandrakar | Rs30000 |
601493 | Nilesh Bahadure | Rs40000 |
601494 | Priyanka Chandrakar | Rs50000 |
實作員薪水料管理系統
步驟1:定義資料類別
首先,我們需要定義一個類別來代表員薪水料。這個類別應該包含員工編號、姓名和薪水等屬性。
class Employee:
def __init__(self, staff_no, name, salary):
self.staff_no = staff_no
self.name = name
self.salary = salary
步驟2:實作新增功能
接下來,我們需要實作新增員薪水料的功能。這可以透過建立一個函式來完成,該函式接受新的員薪水料並將其新增到系統中。
def add_employee(employees, staff_no, name, salary):
new_employee = Employee(staff_no, name, salary)
employees.append(new_employee)
步驟3:實作刪除功能
同樣地,我們需要實作刪除員薪水料的功能。這可以透過建立一個函式來完成,該函式接受要刪除的員工編號並從系統中移除相應的資料。
def remove_employee(employees, staff_no):
for employee in employees:
if employee.staff_no == staff_no:
employees.remove(employee)
return
步驟4:實作查詢功能
最後,我們需要實作查詢員薪水料的功能。這可以透過建立一個函式來完成,該函式接受查詢條件(如員工編號或姓名)並傳回匹配的員薪水料。
def query_employees(employees, staff_no=None, name=None):
result = []
for employee in employees:
if (staff_no is None or employee.staff_no == staff_no) and (name is None or employee.name == name):
result.append(employee)
return result
完整程式碼
以下是完整的程式碼:
class Employee:
def __init__(self, staff_no, name, salary):
self.staff_no = staff_no
self.name = name
self.salary = salary
def add_employee(employees, staff_no, name, salary):
new_employee = Employee(staff_no, name, salary)
employees.append(new_employee)
def remove_employee(employees, staff_no):
for employee in employees:
if employee.staff_no == staff_no:
employees.remove(employee)
return
def query_employees(employees, staff_no=None, name=None):
result = []
for employee in employees:
if (staff_no is None or employee.staff_no == staff_no) and (name is None or employee.name == name):
result.append(employee)
return result
# 範例使用
employees = []
add_employee(employees, "601490", "Divya Sharma", "Rs10000")
add_employee(employees, "601491", "Yathartha Chandrakar", "Rs20000")
print("所有員工:")
for employee in employees:
print(f"員工編號: {employee.staff_no}, 姓名: {employee.name}, 薪水: {employee.salary}")
print("\n查詢員工編號為601490的員工:")
result = query_employees(employees, staff_no="601490")
for employee in result:
print(f"員工編號: {employee.staff_no}, 姓名: {employee.name}, 薪水: {employee.salary}")
圖表翻譯:
flowchart TD A[開始] --> B[定義Employee類別] B --> C[實作新增功能] C --> D[實作刪除功能] D --> E[實作查詢功能] E --> F[範例使用] F --> G[輸出結果]
圖表解釋:
此圖表展示了員薪水料管理系統的設計和實作過程。從定義Employee類別開始,到實作新增、刪除和查詢功能,最後進行範例使用並輸出結果。每一步驟都對應到程式碼中的特定部分,清晰地展示了系統的邏輯流程。
資料過濾與字串方法
在資料分析中,能夠有效地過濾資料是非常重要的。Pandas函式庫提供了多種方法來過濾資料框(DataFrame)中的資料,包括使用字串方法。以下將介紹如何使用contains()、startswith()
和endswith()
方法來過濾資料框中的資料。
使用contains()方法
contains()
方法可以用來查詢資料框中是否包含特定的子字串。這個方法傳回一個布林值系列,指示每個字串是否包含指定的子字串。語法如下:
df['column_name'].str.contains(sub_string, case=False, flags=0, na=False, regex=False)
其中,sub_string
是要查詢的子字串,case
引數用於指定是否進行大小寫敏感的查詢,flags
引數用於指定正規表示式的標誌,na
引數用於指定當遇到缺失值時的傳回值,regex
引數用於指定是否將sub_string
作為正規表示式處理。
使用startswith()和endswith()方法
startswith()
和endswith()
方法分別用於查詢字串是否以特定的子字串開頭或結尾。這兩個方法也傳回布林值系列。語法如下:
df['column_name'].str.startswith(sub_string)
df['column_name'].str.endswith(sub_string)
這些方法可以用於過濾資料框中的資料,例如:
import pandas as pd
# 建立一個示例資料框
data = {
'name': ['YATHARTHA_CHANDRAKAR', 'SAURABH_CHANDRAKAR', 'NILESH_BAHADURE', 'PRIYANKA_CHANDRAKAR'],
'salary': [20000, 30000, 40000, 50000],
'staff_no': [601491, 601492, 601493, 601494]
}
df = pd.DataFrame(data)
# 使用contains()方法過濾資料
filtered_df = df[df['name'].str.contains('CHANDRAKAR')]
print(filtered_df)
# 使用startswith()方法過濾資料
filtered_df = df[df['name'].str.startswith('Y')]
print(filtered_df)
# 使用endswith()方法過濾資料
filtered_df = df[df['name'].str.endswith('KAR')]
print(filtered_df)
這些示例展示瞭如何使用字串方法來過濾資料框中的資料。透過使用這些方法,可以更有效地查詢和過濾資料,從而得到所需的結果。
使用Pandas進行條件過濾
在資料分析中,過濾資料是非常重要的一步。Pandas提供了多種方法來過濾資料。以下是使用Pandas進行條件過濾的範例。
條件過濾
首先,我們需要建立一個DataFrame。
import pandas as pd
# 建立一個DataFrame
data = {
'myname': ['Divya Sharma', 'Yathartha Chandrakar', 'Suresh'],
'mysalary': [10000, 20000, 30000],
'mystaffno': [601490, 601491, 601492]
}
mypd_dataframe = pd.DataFrame(data)
接下來,我們可以使用條件過濾來選擇符合條件的行。
# 過濾所有以字母'S'開頭的名字
mycond = mypd_dataframe['myname'].str.startswith('S')
print(mypd_dataframe[mycond])
print('-'*50)
# 過濾所有以字母'r'結尾的名字
mycond = mypd_dataframe['myname'].str.endswith('r')
print(mypd_dataframe[mycond])
print('-'*50)
# 過濾所有包含'y'的名字(區分大小寫)
mycond = mypd_dataframe['myname'].str.contains('y')
print(mypd_dataframe[mycond])
print('-'*50)
# 如果我們想要不區分大小寫的資料,可以使用case引數
mycond = mypd_dataframe['myname'].str.contains('y', case=False)
print(mypd_dataframe[mycond])
內容解密:
在上面的範例中,我們使用了str.startswith()
、str.endswith()
和str.contains()
方法來過濾資料。這些方法都可以用來選擇符合條件的行。
str.startswith()
: 選擇以指定字串開頭的行。str.endswith()
: 選擇以指定字串結尾的行。str.contains()
: 選擇包含指定字串的行。
如果我們想要不區分大小寫的資料,可以使用case=False
引數。
圖表翻譯:
flowchart TD A[資料過濾] --> B[選擇條件] B --> C{區分大小寫} C -->|是| D[使用str.startswith()、str.endswith()或str.contains()] C -->|否| E[使用str.contains() with case=False] D --> F[選擇符合條件的行] E --> F
在這個圖表中,我們可以看到資料過濾的流程。首先,我們需要選擇條件,然後決定是否要區分大小寫。如果是,則使用str.startswith()
、str.endswith()
或str.contains()
方法。如果否,則使用str.contains()
方法並設定case=False
引數。最後,選擇符合條件的行。
員薪水料管理系統
在現代企業中,員薪水料管理是一個非常重要的工作。它涉及到員工的基本資訊、薪資、職位等多方面的資料。下面,我們將透過一個簡單的例子來展示如何使用Python來管理員薪水料。
員薪水料結構
首先,我們需要定義員薪水料的結構。這裡,我們使用一個字典來儲存每個員工的資訊,包括姓名、薪資和員工編號。
# 定義員薪水料結構
class Employee:
def __init__(self, name, salary, staff_no):
self.name = name
self.salary = salary
self.staff_no = staff_no
def __str__(self):
return f"{self.name} ${self.salary} {self.staff_no}"
員薪水料管理
接下來,我們需要建立一個系統來管理這些員薪水料。這裡,我們使用一個列表來儲存所有員工的資料,並提供新增、刪除和查詢員薪水料的功能。
# 定義員薪水料管理系統
class EmployeeManager:
def __init__(self):
self.employees = []
def add_employee(self, employee):
self.employees.append(employee)
def remove_employee(self, staff_no):
self.employees = [employee for employee in self.employees if employee.staff_no!= staff_no]
def get_employees(self):
return self.employees
def print_employees(self):
for employee in self.employees:
print(employee)
實際應用
現在,我們可以使用這個系統來管理員薪水料了。下面是一個簡單的例子:
# 建立員薪水料管理系統
manager = EmployeeManager()
# 新增員薪水料
manager.add_employee(Employee("Yathartha Chandrakar", 20000, 601491))
manager.add_employee(Employee("Saurabh Chandrakar", 30000, 601492))
manager.add_employee(Employee("Priyanka Chandrakar", 50000, 601494))
manager.add_employee(Employee("Soumya Chandrakar", 60000, 601495))
# 列出所有員薪水料
print("所有員薪水料:")
manager.print_employees()
# 刪除員薪水料
manager.remove_employee(601492)
# 列出剩餘員薪水料
print("\n剩餘員薪水料:")
manager.print_employees()
內容解密:
在上面的例子中,我們定義了一個Employee
類別來儲存每個員工的資訊,包括姓名、薪資和員工編號。然後,我們定義了一個EmployeeManager
類別來管理所有員工的資料,包括新增、刪除和查詢員薪水料的功能。最後,我們使用這個系統來管理員薪水料,並展示瞭如何新增、刪除和列出員薪水料。
圖表翻譯:
flowchart TD A[建立員薪水料管理系統] --> B[新增員薪水料] B --> C[刪除員薪水料] C --> D[列出剩餘員薪水料] D --> E[結束]
圖表翻譯:
此圖表展示了員薪水料管理系統的流程,從建立系統開始,到新增員薪水料,然後刪除員薪水料,最後列出剩餘員薪水料。這個流程展示瞭如何使用這個系統來管理員薪水料。
處理 CSV 檔案中的姓名欄位
在這個例子中,我們將使用 Pandas 函式庫來讀取和處理 CSV 檔案。首先,我們需要讀取 CSV 檔案並將其轉換為 DataFrame。
import pandas as pd
# 讀取 CSV 檔案
df = pd.read_csv('df_string_eg.csv')
# 對索引進行排序
df.sort_index(inplace=True)
# 顯示原始 DataFrame
print(df)
print('-'*50)
接下來,我們需要將 myname
欄位中的姓名分割成 myfirstname
和 mysecondname
兩個欄位。可以使用 str.split
方法來實作這一點。
# 將 myname 欄位中的姓名分割成 myfirstname 和 mysecondname
df[['myfirstname', 'mysecondname']] = df['myname'].str.split(expand=True)
# 移除 myname 欄位
df = df.drop('myname', axis=1)
# 顯示更新後的 DataFrame
print(df)
在這個過程中,我們使用 str.split
方法將 myname
欄位中的姓名分割成兩個部分,並使用 expand=True
引數將結果轉換為 DataFrame。然後,我們使用 drop
方法移除 myname
欄位。
內容解密:
pd.read_csv
函式用於讀取 CSV 檔案。sort_index
方法用於對索引進行排序。str.split
方法用於分割字串。expand=True
引數用於將結果轉換為 DataFrame。drop
方法用於移除欄位。
圖表翻譯:
flowchart TD A[讀取 CSV 檔案] --> B[對索引進行排序] B --> C[分割 myname 欄位] C --> D[移除 myname 欄位] D --> E[顯示更新後的 DataFrame]
在這個流程圖中,我們可以看到從讀取 CSV 檔案到顯示更新後的 DataFrame 的整個過程。每一步驟都對應著上述程式碼中的特定操作。
從使用者經驗的最佳化角度,Pandas 提供了強大的資料處理和操作功能,簡化了資料清理、轉換、過濾和分析的流程。本文涵蓋了資料複製、字串處理、條件篩選以及資料結構設計等多個方面,展現了 Pandas 在資料處理方面的靈活性與效率。然而,Pandas 的效能瓶頸在處理極大規模資料時仍需考量,尤其是在記憶體容量有限的情況下。對於大型資料集,可以考慮使用 Dask 或 Spark 等分散式計算框架來提升處理效能。技術團隊應著重於資料集大小與 Pandas 效能的平衡,並針對特定應用場景選擇合適的工具和策略,才能最大限度地發揮 Pandas 的優勢。未來,隨著資料科學領域的持續發展,預見 Pandas 將持續整合更多先進的資料處理技術,並在資料分析生態系統中扮演更重要的角色。