Skip to content

[Python] 如何取代 Pandas DataFrame 中特定 column 內的值

Last Updated on 2022-05-25 by Clay

在做資料處理的過程中,經常會有需要將特定 column 的值做替換的步驟。可能是處理 missing value、可能是將錯誤的數值刪除...... 當然,Python 有眾多的工具、套件、函式可以來進行常見的取代任務。不過,總難免會有需要特殊處理的情況。

今天我要記錄的,就是如何直接用程式來取代 pandas 的 DataFrame 資料結構中特定 column 的值。


使用 replace() 來取代

當然,pandas DataFrame 中本來就內建了 replace() 的替換方法。假設我們有以下這樣的一些資料:

# coding: utf-8
import pandas as pd


def main():
    df = pd.DataFrame(
        [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9]],
        columns=["A", "B", "C"],
    )

    print(df.head())


if __name__ == "__main__":
    main()


Output:

   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9


那麼,如果我們今天要替換掉所有 C 當中的值,比方說要將其全部歸零,我們可以這樣做:

# coding: utf-8
import pandas as pd


def main():
    df = pd.DataFrame(
        [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9]],
        columns=["A", "B", "C"],
    )

    df["C"].replace({3: 0, 6: 0, 9: 0}, inplace=True)

    print(df.head())


if __name__ == "__main__":
    main()


Output:

   A  B  C
0  1  2  0
1  4  5  0
2  7  8  0


沒錯!這樣一來,我們就取代掉 C 行所有值了。


使用自製規則來取代特定值

當然,你可能會想說,我們要取代的值可能沒有那麼單純;或者是全部的值都要取代的話,可能寫起來很麻煩。

不過想必大家都注意到了,我們要替換的原值與新值是用一個 dict 的結構儲存著。這意味著只要我們能寫出規則來表示原值與新值的對應關係,我們就可以自己產製一個字典(dictionary)給 DataFrame 來進行取代。

假設今天,我要把所有 C 行中的值全部乘以 2、但是最大值就是 15,不能再多了,我該如何寫呢?

簡單來說,我們就是寫一套規則來產生字典,來把 C 行中的所有值跟新值對應起來;接著再把這個字典放到 replace() 中。

# coding: utf-8
from typing import Dict
import pandas as pd


def replace_map(df) -> Dict:
    replace_values = dict()

    for index, row in df.iterrows():
        replace_values[row["C"]] = min(15, row["C"]*2)

    return replace_values



def main():
    df = pd.DataFrame(
        [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9]],
        columns=["A", "B", "C"],
    )

    df["C"].replace(replace_map(df), inplace=True)

    print(df.head())


if __name__ == "__main__":
    main()


Output:

   A  B   C
0  1  2   6
1  4  5  12
2  7  8  15


我不敢保證這是最好的方法,但這目前很好地解決了我的問題。如果還有更好的寫法,歡迎隨時告訴我。我很樂於學習更佳的寫法!


References


Read More

Leave a Reply