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進行新增列的賦值;
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列修改為日期格式,這樣才能進行日期運算
data["col_1"] = pd.to_datetime(data["col_1"])
三、對整列進行運算
用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ù)對列中的每個值進行處理
用來處理的函數(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ù)進行處理,定義的函數(shù)中第一個參數(shù)默認為數(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)文章
Python列表常見操作詳解(獲取,增加,刪除,修改,排序等)
這篇文章主要介紹了Python列表常見操作,結(jié)合實例形式總結(jié)分析了Python列表常見的獲取、增加、刪除、修改、排序、計算等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
selenium+python自動化測試之使用webdriver操作瀏覽器的方法
這篇文章主要介紹了selenium+python自動化測試之使用webdriver操作瀏覽器的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
Python使用itertools模塊實現(xiàn)排列組合功能示例
這篇文章主要介紹了Python使用itertools模塊實現(xiàn)排列組合功能,涉及Python基于itertools模塊product、permutations與combinations_with_replacement方法進行排列、組合等相關(guān)操作實現(xiàn)技巧,需要的朋友可以參考下2018-07-07
使用Python實現(xiàn)Excel表格轉(zhuǎn)圖片
在數(shù)據(jù)處理與信息分享過程中,Excel表格作為一種強大的數(shù)據(jù)管理工具被廣泛應(yīng)用,這篇文章主要為大家詳細介紹了如何使用Python將Excel表格轉(zhuǎn)換為圖片,需要的可以參考下2024-04-04
python基于socketserver實現(xiàn)并發(fā),驗證客戶端的合法性
TCP協(xié)議的socket一次只能和一個客戶端通信, 而socketsever可以時間和多個客戶端通信。本文將講解socketserver的具體使用2021-05-05

