pandas如何給DataFrame新增列并賦值
pandas給DataFrame新增列并賦值
給DataFrame新增列的話,除了join,merge,concat這些函數(shù)之外,還可以通過簡單的df['new_column']=values的形式對其新增列,但是在使用這種方式新增列時,需要注意索引問題以及新增多列時該如何操作。
索引問題
這個問題只有在等號右邊的對象是Series或者DataFrame時需要注意,因為這時等號右邊的對象是有索引的,這樣賦值時,要保證新增對象的索引和左邊對象的索引一致,不然也只會保存一致的索引對應(yīng)的值,其他的值為NaN。當(dāng)然,對于新增一列的情形,可以直接在等號右邊以列表或者ndarray等沒有索引的可迭代對象賦值,從而避免索引問題。但是對于新增多列的情形,就不能用這種方式避免索引問題的,具體原因如下。
新增多列的簡單方式
新增多列時,這里講的時上述的簡單賦值方式,而不是利用join,merge,concat等這些函數(shù)去實現(xiàn)。不同于新增一列,新增一列可以直接用df['new_col']=values的方式,新增多列時,需要用df[['col1','col2',...]]=values的方式,里面需要用列表包含多個新增的列名,此外更重要的是,這時的values必須得是DataFrame,往往我們?nèi)菀紫氘?dāng)然的以為這時values也可以是ndarray或者list等對象,但實際則不然,其必須得是DataFrame,所以這時也一定要考慮索引問題;當(dāng)然,其實完全可以實現(xiàn)和新增一列相同的形式,即values也可以是其他對象,這里之所以這樣要求其必須是DataFrame,只是一種規(guī)定而已,似乎并沒有其他合理的理由。
其他需要注意的點以及小結(jié)
1、df[['col']]索引得到的對象是一個DataFrame,不再是一個Series,所以要對其新增列,右邊的對象也應(yīng)該是DataFrame;
2、不能用loc或者iloc進(jìn)行新增列的賦值;
3、所以新增單列,用df['col']=values的方式,values可以為Series,list或ndarray等對象,或者也可以用df[['col']]=values,values必須為DataFrame;新增多列用df[['col1','col2',...]]=values,values必須為DataFrame;當(dāng)values為Series或者DataFrame時,需要注意索引問題。
DataFrame處理數(shù)據(jù)——列處理
首先導(dǎo)入pandas庫,創(chuàng)建一個數(shù)據(jù)框?qū)ο蟆?/p>
import pandas as pd data = pd.DataFrame()
一、插入數(shù)據(jù)為列
將數(shù)據(jù)以列表或者Series對象的形式傳給data,列名為“col_1”,可自己定義
data["col_1"] = ["2023-01-01", "2023-02-05", "2023-03-14", "2023-12-31", "2023-05-06"]
二、新增或修改列
增加一個列名為“today”的列
from datetime import datetime as dt data["today"] = dt.today()
將col_1列修改為日期格式,這樣才能進(jìn)行日期運算
data["col_1"] = pd.to_datetime(data["col_1"])
三、對整列進(jìn)行運算
用today列減去col_1列,生成col_2列
data["col_2"] = data["today"] - data["col_1"]
不過這樣處理得到的差值數(shù)據(jù)類型是datetime庫里的Timedelta對象,在數(shù)據(jù)分析中這樣的數(shù)據(jù)類型意義不大,需要調(diào)用Timedelta的屬性來提取具體的天數(shù)差,操作見第四節(jié)。
四、用函數(shù)對列中的每個值進(jìn)行處理
用來處理的函數(shù)如果較為簡單,可以使用如下方法,在apply方法中用lambda定義函數(shù),其中x表示被處理的對象,在下面的代碼中對應(yīng)的是col_2這個Series中的每個“時間差”對象(Timedelta),用“.days”來訪問天數(shù)屬性,將時間差轉(zhuǎn)換成天數(shù)(數(shù)據(jù)類型也會相應(yīng)地變成整型)。
data["col_2"] = data["col_2"].apply(lambda x: x.days)
處理數(shù)據(jù)的函數(shù)如果比較復(fù)雜,也可以先定義函數(shù),再對數(shù)據(jù)進(jìn)行處理,定義的函數(shù)中第一個參數(shù)默認(rèn)為數(shù)據(jù)框傳入的值,如果有多個參數(shù),在調(diào)用apply時要用args后加可迭代對象(如列表,元組)包裹起來,傳入的實參與函數(shù)中的形參位置一一對應(yīng)。
需要注意的是,將函數(shù)傳入apply時不需要加括號。
def get_date_format(x, y): x = dt.strftime(x, y) return x data["col_3"] = data["col_1"].apply(get_date_format, args=["%Y年%m月%d日"])
五、選擇自己需要的列
方法比較簡單,不過多贅述,直接上代碼:
data = data[["col_2", "col_3"]]
六、修改列名
方法比較簡單,不過多贅述,直接上代碼:
data.rename(columns={"col_2":"天數(shù)差", "col_3":"日期"}, inplace=True) # 也可以用以下方法,修改全部列名 columns = ["原日期", "今天", "天數(shù)差", "修改后日期"] data.columns = columns inplace=True表示在該對象上直接修改
七、刪除列
方法比較簡單,不過多贅述,直接上代碼:
data.drop(["原日期", "今天"], axis=1, inplace=True)
列表中的值表示列名,執(zhí)行上方代碼,會刪除“原日期”和“今天”這兩個列。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決pandas.DataFrame.fillna 填充Nan失敗的問題
今天小編就為大家分享一篇解決pandas.DataFrame.fillna 填充Nan失敗的問題。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解
這篇文章主要介紹了Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02python中的Numpy二維數(shù)組遍歷與二維數(shù)組切片后遍歷效率比較
這篇文章主要介紹了python中的Numpy二維數(shù)組遍歷與二維數(shù)組切片后遍歷效率比較,在python-numpy使用中,可以用雙層?for循環(huán)對數(shù)組元素進(jìn)行訪問,也可以切片成每一行后進(jìn)行一維數(shù)組的遍歷,下面小編擊來舉例介紹吧,需要的朋友可以參考一下2022-03-03使用wxpython實現(xiàn)的一個簡單圖片瀏覽器實例
這篇文章主要介紹了使用wxpython實現(xiàn)的一個簡單圖片瀏覽器實例,根據(jù)自己的特殊需求而寫,需要的朋友可以參考下2014-07-07詳解在python中如何使用zlib模塊進(jìn)行數(shù)據(jù)壓縮和解壓縮
Python有一些內(nèi)置庫用于處理數(shù)據(jù)壓縮和解壓縮,其中一個就是zlib模塊,這個模塊為DEFLATE壓縮算法和相關(guān)的gzip(文件格式)提供了支持,在這篇文章中,我們將深入探討如何使用zlib模塊進(jìn)行數(shù)據(jù)壓縮和解壓縮2023-06-06