看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在给 DataFrame 增加一个新列时,我们经常会使用 df['a'] = 1
这样的方法,但 pandas 提供了一个面向对象的 assign() 方法,帮助我们方便地指定一个新列。assign() 方法在我们解决问题时经常会用用到,除了满足增加列的需求外,还可以创建操作辅助列,让操作过程更加清晰简单。
pandas assign() 只能使用在 DataFrame 对象上,的语法为:
DataFrame.assign(**kwargs)
参数为可变关键字参数,形式如 {str: callable or Series}
的字典。其中:
根据可变关键字参数 的用法,我们可以传入一个字典或者传入多个关键字=参数值
的形式指定新列,这样就支持一次性增加多个列,或者连续使用增加多个列。
即:
# 以下代码效果相同,都增加了 a、b、c、d 三列
# 字典解包
df.assign(**{'a': range(10),
'b': 2,
'c': lambda d: d.a + 1,
'd': df.col+2})
# 关键字参数
df.assign(a=range(10),
b=2,
c=lambda d: d.a + 1,
d=df.col+2)
# 单行编写
df.assign(a=range(10)).assign(b=2).assign(c=lambda d: d.a+1, d=df.col+2)
# 分行编写
(
df.assign(a=range(10))
.assign(b=2)
.assign(c=lambda d: d.a+1, d=df.col+2)
)
如果新列的名字不符合 Python 的变量命名规则(如 2nd),则需要按第一种方式打指定新列。上例中 c 列的计算依赖新增加的 a 列值,则需要使用 lambda 来引用已经赋成的 DataFrame(前续的 a、b 列视为已经生成),如果不需要则直接使用原 DataFrame 的值,如上例的 d 列。
返回一个 DataFrame,除了原有的列之外,还包含本次操作新增加的列,新列在原来所有列的最右边(如果是多个列,则按代码执行顺序)。如果新增加的列名已经存在,仅会将新值覆盖到原 DataFrame 的同名列上,这样就可以实现数据修改的效果。
以下是一些应用示例:
df = pd.DataFrame({'temp_c': [17.0, 25.0]},
index=['Portland', 'Berkeley'])
df
'''
temp_c
Portland 17.0
Berkeley 25.0
'''
# 其中值是可调用的,根据df进行计算
df.assign(temp_f=lambda x: x.temp_c * 9 / 5 + 32)
'''
temp_c temp_f
Portland 17.0 62.6
Berkeley 25.0 77.0
'''
# 可以通过直接引用现有序列或序列来实现相同的行为
df.assign(temp_f=df['temp_c'] * 9 / 5 + 32)
'''
temp_c temp_f
Portland 17.0 62.6
Berkeley 25.0 77.0
'''
# 可以在同一分配中创建多个列,其中一个列依赖于同一分配中定义的另一个列
df.assign(temp_f=lambda x: x['temp_c'] * 9 / 5 + 32,
temp_k=lambda x: (x['temp_f'] + 459.67) * 5 / 9)
temp_c temp_f temp_k
'''
Portland 17.0 62.6 290.15
Berkeley 25.0 77.0 298.15
'''
更新时间:2022-04-29 17:03:30 标签:pandas python 数据列