攝影或3C

Python: pandas.Series如何只保留str,去除重複值?#Series.apply( function )逐元素應用function運算 #DataFrame.apply( function )逐Series應用function運算 .drop_duplicates() 跟.unique()有何差別?

在Python的Pandas庫中,如果你想處理一個Series對象以便只保留字符串類型的數據,並且去除重覆值,你可以使用以下方法:

篩選字符串類型的數據:使用apply方法結合isinstance函數來檢查每個元素是否為字符串(str類型)。
去除重覆值:使用drop_duplicates()方法去除重覆的元素。
下面是一個具體的示例代碼:

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 23 19:34:09 2024

@author: SavingKing
"""

import pandas as pd

# 創建一個示例 Series
data = pd.Series(['apple', 100, 'banana', 'apple', 
                  'orange', 42, 'banana'])

# 篩選字符串類型的數據
str_data = data[data.apply(lambda x: isinstance(x, str))]

# 去除重覆值
unique_str_data = str_data.drop_duplicates()

print(unique_str_data)

輸出結果:

在這個例子中:

data.apply(lambda x: isinstance(x, str))
會遍歷Series中的每個元素,檢查它是否是字符串。
str_data 只包含字符串類型的數據。
str_data.drop_duplicates() 則從str_data中去除重覆的字符串。
執行上述代碼後,輸出將會是一個沒有重覆字符串的Series。
.unique().drop_duplicates()類似
但返回的是 numpy.array,
會少掉Series的.name屬性
(常用來嵌入輸出的檔名中)

.drop_duplicates?


不使用匿名函數:

import pandas as pd
from typing import Any

# 定義一個函數檢查元素是否為字符串類型
def is_string(x: Any)->bool:
    return isinstance(x, str)

# 創建一個示例 Series
data = pd.Series(['apple', 100, 'banana',
 'apple', 'orange', 42, 'banana'])

# 篩選字符串類型的數據
str_data = data[data.apply(is_string)]

# 去除重覆值
unique_str_data = str_data.drop_duplicates()

print(unique_str_data)

在Pandas中使用像apply這樣的方法處理Series或DataFrame時,不需要顯式使用for循環來遍歷所有元素,這是因為這些方法內部已經實現了遍歷元素的邏輯。下面是一些關鍵點,解釋為什麽不需要顯式的for循環:

  1. 內部叠代
    apply函數在內部執行叠代,這意味著它會自動處理Series中的每一個元素。當你調用data.apply(is_string)時,apply方法會逐一將Series中的每個值傳遞給is_string函數,並收集返回結果。這個過程是自動的,隱藏了叠代的細節。
  2. 向量化操作
    Pandas和NumPy的很多操作是向量化的。向量化意味著操作可以同時應用於數組或序列的多個元素,而無需顯式循環每個元素。這不僅使代碼更簡潔,而且通常比使用純Python循環更高效,因為這些操作是在底層經過優化的C代碼中實現的。
  3. 效率和性能
    使用像apply這樣的方法通常比使用普通的Python for循環更高效。這是因為Pandas的這些函數利用了Cython或其他底層優化技術來加速數據處理。雖然apply本身並不總是向量化操作,但它比純Python循環更優化。
  4. 簡潔的代碼
    使用內置的函數如apply、map、filter等,可以使代碼更簡潔、更易於理解和維護。這些函數采用函數式編程的風格,減少了錯誤的可能性,特別是在覆雜的數據處理和轉換中。

例如,當使用drop_duplicates()方法時,Pandas內部處理所有的查找和比較操作,以確定哪些值是重覆的,然後返回一個沒有重覆項的新Series。這一切都是自動完成的,無需用戶編寫覆雜的循環邏輯。

這種方法的好處是讓使用者能夠編寫高級的數據處理邏輯,而不必關心底層的實現細節,從而提高開發效率和程序的運行效率。

推薦hahow線上學習python: https://igrape.net/30afN

.apply()方法在Pandas庫中既可以用於Series對象,也可以用於DataFrame對象,但它們的用法和行為有所不同。讓我們來看看兩者之間的主要區別:

對於 Series
當.apply()用於Series時,它將指定的函數應用於Series的每一個元素。這是一個元素級的操作,每次處理一個Series的單個值。

示例代碼:

import pandas as pd

s = pd.Series([1, 2, 3])
result = s.apply(lambda x: x ** 2)
print(result)

輸出結果:

對於 DataFrame
當.apply()用於DataFrame時,它可以沿指定的軸(行或列)應用一個函數。默認情況下,.apply()對DataFrame的每一列操作,但可以通過設置axis參數改為對每一行操作。

示例代碼:

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

# 默認情況下apply 對列操作
result_col = df.apply(lambda x: x.sum())  # 對每一列求和
print("Column sums:\n", result_col)

# 設置 axis=1 對行操作
result_row = df.apply(lambda x: x.sum(), axis=1)  # 對每一行求和
print("\nRow sums:\n", result_row)

輸出結果:

在DataFrame中使用.apply()時,傳遞給函數的是整列(或整行),這與在Series中每次傳遞一個元素不同。因此,這個函數需要能夠接收並處理一個序列(Series)。

總結
.apply()是一個非常靈活的方法,可以在Series和DataFrame上實現覆雜的數據轉換。在DataFrame中使用時,它特別強大,因為你可以決定是按行處理還是按列處理,這取決於你的具體需求。

推薦hahow線上學習python: https://igrape.net/30afN

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡