python df.assign()临时列应用
指定列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