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
- https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace.html
- https://www.geeksforgeeks.org/python-pandas-dataframe-replace/