python学习_pandas如何对每行进行操作(apply函数用法)


楔子

在对dataframe做处理时,有个需求需要对dataframe的每一行的不同列进行操作,如何做到呢?

经过搜索,发现pandas内部的apply函数可以完美解决这个问题,但是网上的示例不够清晰,特别是每一行作为参数要写吗?如果要用到外部参数又该怎么写?

在此记录下学习过程,希望对看到这篇博客的你也有帮助。

apply函数的使用

源码查看

image-20220511194028441

经过查看引用,发现apply函数可以对dataframe和Series类型使用,此处我们查看dataframe的apply:

def apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds):
    """
    Apply a function along an axis of the DataFrame.

    Objects passed to the function are Series objects whose index is
    either the DataFrame's index (``axis=0``) or the DataFrame's columns
    (``axis=1``). By default (``result_type=None``), the final return type
    is inferred from the return type of the applied function. Otherwise,
    it depends on the `result_type` argument.
    """

通过函数介绍,我们知道了以下信息:

  1. apply会将自定义的func函数应用在dataframe的每列或者每行上面。
  2. func接收的是每列或者每行转换成的一个Series对象,此对象的索引是行索引(对df每列操作时)或者列索引(对每行操作时),axis=0代表对每行操作,axis=1代表对每列操作
  3. apply函数的返回仍是一个Series对象,索引不变,值取决于自定义函数func的返回类型。如果定义了result_type参数,则返回类型根据此参数执行变化。

使用示例

由于我要解决的问题是对每行进行带参数的操作,经过搜索和尝试,最终应用如下:

# 新建一个示例dataframe,用于测试
>>> df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
>>> df
   A  B
0  4  9
1  4  9
2  4  9

# 0.首先定义一个函数,此函数要对df的每行进行操作
# 1.需要重点说明的就是fun1的第一个形参就是df的每一行,可以把此行当做字典,键就是列名;
# 2.在此之后的形参才是apply函数中args的参数,即我们要传入的外部参数
def fun1(row, num):  # row是dataframe的每一行,num是外部要用的参数
    return row['A'] + row['B'] > num

# 0.因为是对每行操作,所以axis=1,fun1的首个参数为row,如果axis=0,row用column表示更易理解
# 1.fun1的参数在args里面传,并且不用传递row,这个是默认作为第一个参数的
# 2.args必须是个元组,如果你的参数只有一个,那么必须写出如下形式(10,),因为(10)不是元组,而是int
# 3.如果传多个参数则不用在最后写逗号
>>> a = df.apply(fun1, args=(10,), axis=1)

# 我们将结果打印,看下apply返回的值
# 可见是类似Series的数据,它的索引与原始df相同,值与fun1函数的返回相同
>>> print(a)
0    True
1    True
2    True
dtype: bool

总结

1.一般对于无需传递外部参数一维可迭代对象(Series,list),一般使用map(lambda x: 函数体)的形式就可以对单一元素对象进行操作了;

2.对于dataframe这一类二维表,需要对其中的每个单一维度(每行或者每列)进行操作,apply函数可以说是瑞士军刀般的解决方案了。

3.在实际使用过程中其实我还想用当前行与其上一行进行逻辑操作,但是没找到什么好的方法,如有思路,还请指教。

posted @ 2023-12-15 18:05  故君子慎为善  阅读(727)  评论(0)    收藏  举报