python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > pandas给DataFrame新增列并赋值

pandas如何给DataFrame新增列并赋值

作者:S_o_l_o_n

这篇文章主要介绍了pandas如何给DataFrame新增列并赋值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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)

列表中的值表示列名,执行上方代码,会删除“原日期”和“今天”这两个列。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文