1.前言
很多刚接触pandas的不太清楚,怎么进行类似于sql的多字段求和、或者类似于sas的多字段处理,下面举几个例子讲讲pandas如何进行多变量/多字段操作:
2.数据准备
首先,造一点数据用于举例:
代码:
import pandas as pd
df = pd.DataFrame([["a1",2,3],["a2",5,6],["b1",5,6]])
df.columns = ["a","b","c"]
3.一个简单的多字段求和例子
现在对b、c字段求和,生成d变量:
代码:
df['d'] = df[["a","b"]].apply(lambda x : sum(x) ,axis = 1)
4.例子原理解析
4.1 例子用到的apply函数
apply函数是用在dataframe的,而map函数是用在series的,基本上用多了pandas就会用到这两个函数,主要是给多列或多行做批量处理用的,功能非常强大,基本可以实现sas、sql的所有功能,也可以自定义批量处理函数,后续会专门陆续补充这两个函数的介绍内容。
4.2 axis参数的影响
对于刚刚接触pandas搞数据的小伙伴,这个参数可能有点让人难以理解,对于一般使用来说,只需要理解,当axis = 1的时候,x传进来的就是一行数据,是一个列表,列表里的每个元素代表某列的该行的值;当axis = 0 的时候, x传进来的就是一列数据。
5.举一反三的应用
5.1 直接在lambda表达式构造处理流程
下面实现了一个功能:当a列包含字符“a”的时候,返回b和c的求和结果,否则返回0,结果保存在d列
df['d'] = df[["a","b"]].apply(lambda x : x[1] + x[2] if x[0].find("a") != -1 else 0,axis = 1)
5.1 自定义多列处理的函数
下面定义了一个多列处理函数,对于每一行求和,在原来的基础上加上了一个判断,即每一行的元素值要大于某个值的时候,才求和,否则跳过。
def sumif(x,value):
mark = 0
for i in x:
if i > value:
mark = mark + i
return mark
df['d'] = df[["a","b"]].apply(lambda x : sumif(x,2) ,axis = 1)
5.小结
其实本身dataframe里也封装了很多典型的方法用于多字段操作(主要是筛选记录),但是做数据的需求太复杂,有时候需要自定义的定制化函数来处理,本文介绍了pandas的多变量/多字段操作,通过一个小例子来介绍了pandas进行多列操作的原理,目的是提供一个更灵活的解决方案。