pandas如何给DataFrame新增列并赋值
作者:S_o_l_o_n
pandas给DataFrame新增列并赋值
给DataFrame新增列的话,除了join,merge,concat这些函数之外,还可以通过简单的df['new_column']=values的形式对其新增列,但是在使用这种方式新增列时,需要注意索引问题以及新增多列时该如何操作。
索引问题
这个问题只有在等号右边的对象是Series或者DataFrame时需要注意,因为这时等号右边的对象是有索引的,这样赋值时,要保证新增对象的索引和左边对象的索引一致,不然也只会保存一致的索引对应的值,其他的值为NaN。当然,对于新增一列的情形,可以直接在等号右边以列表或者ndarray等没有索引的可迭代对象赋值,从而避免索引问题。但是对于新增多列的情形,就不能用这种方式避免索引问题的,具体原因如下。
新增多列的简单方式
新增多列时,这里讲的时上述的简单赋值方式,而不是利用join,merge,concat等这些函数去实现。不同于新增一列,新增一列可以直接用df['new_col']=values的方式,新增多列时,需要用df[['col1','col2',...]]=values的方式,里面需要用列表包含多个新增的列名,此外更重要的是,这时的values必须得是DataFrame,往往我们容易想当然的以为这时values也可以是ndarray或者list等对象,但实际则不然,其必须得是DataFrame,所以这时也一定要考虑索引问题;当然,其实完全可以实现和新增一列相同的形式,即values也可以是其他对象,这里之所以这样要求其必须是DataFrame,只是一种规定而已,似乎并没有其他合理的理由。
其他需要注意的点以及小结
1、df[['col']]索引得到的对象是一个DataFrame,不再是一个Series,所以要对其新增列,右边的对象也应该是DataFrame;
2、不能用loc或者iloc进行新增列的赋值;
3、所以新增单列,用df['col']=values的方式,values可以为Series,list或ndarray等对象,或者也可以用df[['col']]=values,values必须为DataFrame;新增多列用df[['col1','col2',...]]=values,values必须为DataFrame;当values为Series或者DataFrame时,需要注意索引问题。
DataFrame处理数据——列处理
首先导入pandas库,创建一个数据框对象。
import pandas as pd data = pd.DataFrame()
一、插入数据为列
将数据以列表或者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"]
不过这样处理得到的差值数据类型是datetime库里的Timedelta对象,在数据分析中这样的数据类型意义不大,需要调用Timedelta的属性来提取具体的天数差,操作见第四节。
四、用函数对列中的每个值进行处理
用来处理的函数如果较为简单,可以使用如下方法,在apply方法中用lambda定义函数,其中x表示被处理的对象,在下面的代码中对应的是col_2这个Series中的每个“时间差”对象(Timedelta),用“.days”来访问天数属性,将时间差转换成天数(数据类型也会相应地变成整型)。
data["col_2"] = data["col_2"].apply(lambda x: x.days)
处理数据的函数如果比较复杂,也可以先定义函数,再对数据进行处理,定义的函数中第一个参数默认为数据框传入的值,如果有多个参数,在调用apply时要用args后加可迭代对象(如列表,元组)包裹起来,传入的实参与函数中的形参位置一一对应。
需要注意的是,将函数传入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":"天数差", "col_3":"日期"}, inplace=True) # 也可以用以下方法,修改全部列名 columns = ["原日期", "今天", "天数差", "修改后日期"] data.columns = columns inplace=True表示在该对象上直接修改
七、删除列
方法比较简单,不过多赘述,直接上代码:
data.drop(["原日期", "今天"], axis=1, inplace=True)
列表中的值表示列名,执行上方代码,会删除“原日期”和“今天”这两个列。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。