欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pandas如何給DataFrame新增列并賦值

 更新時(shí)間:2024年02月02日 08:45:25   作者:S_o_l_o_n  
這篇文章主要介紹了pandas如何給DataFrame新增列并賦值問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

pandas給DataFrame新增列并賦值

 給DataFrame新增列的話,除了join,merge,concat這些函數(shù)之外,還可以通過簡單的df['new_column']=values的形式對其新增列,但是在使用這種方式新增列時(shí),需要注意索引問題以及新增多列時(shí)該如何操作。

索引問題

這個(gè)問題只有在等號(hào)右邊的對象是Series或者DataFrame時(shí)需要注意,因?yàn)檫@時(shí)等號(hào)右邊的對象是有索引的,這樣賦值時(shí),要保證新增對象的索引和左邊對象的索引一致,不然也只會(huì)保存一致的索引對應(yīng)的值,其他的值為NaN。當(dāng)然,對于新增一列的情形,可以直接在等號(hào)右邊以列表或者ndarray等沒有索引的可迭代對象賦值,從而避免索引問題。但是對于新增多列的情形,就不能用這種方式避免索引問題的,具體原因如下。

新增多列的簡單方式

新增多列時(shí),這里講的時(shí)上述的簡單賦值方式,而不是利用join,merge,concat等這些函數(shù)去實(shí)現(xiàn)。不同于新增一列,新增一列可以直接用df['new_col']=values的方式,新增多列時(shí),需要用df[['col1','col2',...]]=values的方式,里面需要用列表包含多個(gè)新增的列名,此外更重要的是,這時(shí)的values必須得是DataFrame,往往我們?nèi)菀紫氘?dāng)然的以為這時(shí)values也可以是ndarray或者list等對象,但實(shí)際則不然,其必須得是DataFrame,所以這時(shí)也一定要考慮索引問題;當(dāng)然,其實(shí)完全可以實(shí)現(xiàn)和新增一列相同的形式,即values也可以是其他對象,這里之所以這樣要求其必須是DataFrame,只是一種規(guī)定而已,似乎并沒有其他合理的理由。

其他需要注意的點(diǎn)以及小結(jié)

1、df[['col']]索引得到的對象是一個(gè)DataFrame,不再是一個(gè)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時(shí),需要注意索引問題。

DataFrame處理數(shù)據(jù)——列處理

首先導(dǎo)入pandas庫,創(chuàng)建一個(gè)數(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"]

二、新增或修改列

增加一個(gè)列名為“today”的列

from datetime import datetime as dt
data["today"] = dt.today()

將col_1列修改為日期格式,這樣才能進(jìn)行日期運(yùn)算

data["col_1"] = pd.to_datetime(data["col_1"])

三、對整列進(jìn)行運(yù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ù)對列中的每個(gè)值進(jìn)行處理

用來處理的函數(shù)如果較為簡單,可以使用如下方法,在apply方法中用lambda定義函數(shù),其中x表示被處理的對象,在下面的代碼中對應(yīng)的是col_2這個(gè)Series中的每個(gè)“時(shí)間差”對象(Timedelta),用“.days”來訪問天數(shù)屬性,將時(shí)間差轉(zhuǎn)換成天數(shù)(數(shù)據(jù)類型也會(huì)相應(yīng)地變成整型)。

data["col_2"] = data["col_2"].apply(lambda x: x.days)

處理數(shù)據(jù)的函數(shù)如果比較復(fù)雜,也可以先定義函數(shù),再對數(shù)據(jù)進(jìn)行處理,定義的函數(shù)中第一個(gè)參數(shù)默認(rèn)為數(shù)據(jù)框傳入的值,如果有多個(gè)參數(shù),在調(diào)用apply時(shí)要用args后加可迭代對象(如列表,元組)包裹起來,傳入的實(shí)參與函數(shù)中的形參位置一一對應(yīng)。

需要注意的是,將函數(shù)傳入apply時(shí)不需要加括號(hào)。

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í)行上方代碼,會(huì)刪除“原日期”和“今天”這兩個(gè)列。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論