python df.assign()临时列应用

发布时间 2024-01-01 17:28:15作者: myrj
指定列df.assign()
df.assign(k=v)为指定一个新列的操作,k为新列的列名,v为此列的值,v必须是一个与原数据同索引的Series。今后我们会频繁用到它,它在链式编程技术中相当重要,因此这里专门介绍一下。我们平时在做数据探索分析时会增加一些临时列,如果新列全部使用赋值的方式生成,
则会造成原数据混乱,因此就需要一个方法来让我们不用赋值也可以创建一个临时的列。这种思路适用于所有对原数据的操作,建议在未最终确定数据处理方案时,除了必要的数据整理工作,均使用链式方法,我们在学习完所有的常用功能后会专门介绍这个技术。
我们把上面的增加总分total列的例子用它来实现一下:
# 增加total列
df.assign(total=df.sum(1))
'''
name team Q1 Q2 Q3 Q4 total
0 Liver E 89 21 24 64 198
1 Arry C 36 37 37 57 167
2 Ack A 57 60 18 84 219
3 Eorge C 93 96 71 78 338
4 Oah D 65 49 61 86 261
.. ... ... .. .. .. .. ...
95 Gabriel C 48 59 87 74 268
96 Austin7 C 21 31 30 43 125
97 Lincoln4 C 98 93 1 20 212
98 Eli E 11 74 58 91 234
99 Ben E 21 43 41 74 179
[100 rows x 7 columns]
'''
# 原数据没有变化
df
'''
name team Q1 Q2 Q3 Q4
0 Liver E 89 21 24 64
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
.. ... ... .. .. .. ..
95 Gabriel C 48 59 87 74
96 Austin7 C 21 31 30 43
97 Lincoln4 C 98 93 1 20
98 Eli E 11 74 58 91
99 Ben E 21 43 41 74
[100 rows x 6 columns]
'''
再增加一个Q列,它的元素均为定值100,用逗号分隔再增加一个表达式,或者在语句后继续使用assign方法:
# 增加两列
df.assign(total=df.sum(1), Q=100)
df.assign(total=df.sum(1)).assign(Q=100) # 效果同上
'''
name team Q1 Q2 Q3 Q4 total Q
0 Liver E 89 21 24 64 198 100
1 Arry C 36 37 37 57 167 100
2 Ack A 57 60 18 84 219 100
3 Eorge C 93 96 71 78 338 100
4 Oah D 65 49 61 86 261 100
.. ... ... .. .. .. .. ... ...
95 Gabriel C 48 59 87 74 268 100
96 Austin7 C 21 31 30 43 125 100
97 Lincoln4 C 98 93 1 20 212 100
98 Eli E 11 74 58 91 234 100
99 Ben E 21 43 41 74 179 100
'''
我们再增加两列name_len和avg,name_len值为name的长度,avg为平均分。这时有了过多的assign语句,为了美观整齐,将代码放在括号里:
# 使用了链式方法
(
df.assign(total=df.sum(1)) # 总成绩
.assign(Q=100) # 目标满分值
.assign(name_len=df.name.str.len()) # 姓名长度
.assign(avg=df.mean(1)) # 平均值
.assign(avg2=lambda d: d.total/4) # 平均值2
)
'''
name team Q1 Q2 Q3 Q4 total Q name_len avg avg2
0 Liver E 89 21 24 64 198 100 5 49.50 49.50
1 Arry C 36 37 37 57 167 100 4 41.75 41.75
2 Ack A 57 60 18 84 219 100 3 54.75 54.75
3 Eorge C 93 96 71 78 338 100 5 84.50 84.50
4 Oah D 65 49 61 86 261 100 3 65.25 65.25
.. ... ... .. .. .. .. ... ... ... ... ...
95 Gabriel C 48 59 87 74 268 100 7 67.00 67.00
96 Austin7 C 21 31 30 43 125 100 7 31.25 31.25
97 Lincoln4 C 98 93 1 20 212 100 8 53.00 53.00
98 Eli E 11 74 58 91 234 100 3 58.50 58.50
99 Ben E 21 43 41 74 179 100 3 44.75 44.75
[100 rows x 11 columns]
'''
以上是使用了链式方法的典型代码形式,后期会以这种风格进行代码编写。特别要说明的是avg2列的计算过程,因为df实际是没有total这一列的,如果我们需要使用total列,就需要用lambda来调用。lambda中
第一个变量d是代码执行到本行前的DataFrame内容,可以认为是一个虚拟的DataFrame实体,然后用变量d使用这个DataFrame的数据。作为变量名,d可以替换为其他任意合法的名称,但为了代码可读性,建议使
用d,代表它是一个DataFrame。如果是Series,建议使用s。
以下是其他一些使用示例:
df.assign(Q5=[100]*100) # 新增加一列Q5
df = df.assign(Q5=[100]*100) # 赋值生效
df.assign(Q6=df.Q2/df.Q1) # 计算并增加Q6
df.assign(Q7=lambda d: d.Q1 * 9 / 5 + 32) # 使用lambda
# 添加一列,值为表达式结果:True或False
df.assign(tag=df.Q1>df.Q2)
# 比较计算,True为1,False为0
df.assign(tag=(df.Q1>df.Q2).astype(int))
# 映射文案
df.assign(tag=(df.Q1>60).map({True:'及格',False:'不及格'}))
# 增加多个
df.assign(Q8=lambda d: d.Q1*5,
Q9=lambda d: d.Q8+1) # Q8没有生效,不能直接用df.Q8