pandas中pandas.Series.apply和pandas.DataFrame.apply的用法与比较

举报
橙子园 发表于 2022/05/26 01:20:18 2022/05/26
【摘要】 Series.apply(func, convert_dtype=True, args=(), **kwds)   func:对Series的值调用函数。可以是ufunc(适用于整个Series的NumPy函数)或仅对单个值工作的Python函数   convert_dtype:&n...

Series.apply(funcconvert_dtype=Trueargs=()**kwds)

  func:对Series的值调用函数。可以是ufunc(适用于整个Series的NumPy函数)或仅对单个值工作的Python函数

  convert_dtype:  尝试为基本函数结果找到更好的元素类型(dtype)。如果为False,则元素类型(dtype)为object类

  args:  除了值之外,还要传递给函数的位置参数

  **kwds :  传递给函数的字典参数(多个传递给函数的参数)

实例:


  
  1. df5 = pd.Series([1, 3, 4, 5], index=['a', 'b', 'c', 'd'])
  2. # convert_dtype为False时,返回的元素类型是object,如果为True时,返回的是int64
  3. df3 = df5.apply(lambda x: x**2, convert_dtype=False)
  4. print(df3)
  5. def subtract(x, value):
  6. return x - value
  7. def add(x, **kwargs):
  8. for key, value in kwargs.items():
  9. x += value
  10. return x
  11. # **kwarg接收传递的字典参数
  12. df6 = df5.apply(add, ag=1, ql=2, sd=3)
  13. print(df6)
  14. # value接收了传递的元组参数
  15. df7 = df5.apply(subtract, args=(1,))
  16. print(df7)
  17. # function可以用numpy库提供的函数
  18. df8 = df5.apply(np.log)
  19. print(df8)

总结:可以发现apply在Serise中是将函数应用于整个Serise元素,但是如果一个Serise索引中有多个元素时,就无法用apply直接实现每个元素的函数功能,因为传递进x的是列表,没办法用列表运算,这时还得再遍历一次,才能发挥apply函数的功能,如下代码(如果这里你想到Dataframe中的df4.a.apply()用法,同样的道理,列表是不会有apply()的用法的)。


  
  1. df4 = pd.Series([[1, 3, 5], [3, 9, 0], [4, 8, 0], [5, 7, 5]], index=['a', 'b', 'c', 'd'])
  2. # 这里用列表函数将匿名函数传进来的x再次遍历计算
  3. df4 = df4.apply(lambda x: [i**2 for i in x])
  4. print(df4)

DataFrame.apply(funcaxis=0broadcast=Noneraw=Falsereduce=Noneresult_type=Noneargs=()**kwds)

      DataFrame的apply其实传递给函数的对象是Series对象,其索引是DataFrame的索引(轴=0)或DataFrame的列(轴=1)。默认情况下(result_type=None),从应用函数的返回类型推断最终返回类型。否则,它取决于result_type参数。

func:DataFrame的行列都可以使用apply中的函数

axis : 判断以行计算,还是以列计算,axis=0时是以每一列进行func计算,axis=1时是以每一行进行func计算

broadcast(再接下来的版本会取消,同样的功能在result_type中):值为bool类型,当为False或者None时,不进行广播,如果为True时,进行广播及把进行计算的一行或者一列复制到其他的行列,shape不变,默认为False。

raw:值为bool类型, 当为False时,传递行或列的serise对象给函数func。当为True时,将替换成ndarray对象传给func,如果你只是用numpy中的func的话,这样会加快运算速度。默认为False。

reduce: (接下来的版本会取消,同样的功能在result_type中)值为bool类型和None,当为None时,返回的类型需要根据原来的判断,如果为True时,返回的类型是Serise,False时返回的类型是DataFrame。默认None

result_type:{‘expand’, ‘reduce’, ‘broadcast’, None}, default None,他们用在axis=1时,就是上面提到的功能,expand是将返回like-list结果。

其他的同上。


  
  1. df2 = pd.DataFrame({'manage_score': [12, 34, 34, 56, 67], 'math_score': [23, 52, 35, 77, 67], 'english_score': [90, 23, 53, 66, 67]})
  2. df2['a'] = df2.apply(lambda x: x.max() - x.min(), axis=1)
  3. print(df2)
  4. df2['b'] = df2.manage_score.apply(lambda x: x - 5)
  5. print(df2)
  6. 结果:
  7. manage_score math_score english_score a
  8. 0 12 23 90 78
  9. 1 34 52 23 29
  10. 2 34 35 53 19
  11. 3 56 77 66 21
  12. 4 67 67 67 0
  13. manage_score math_score english_score a b
  14. 0 12 23 90 78 7
  15. 1 34 52 23 29 29
  16. 2 34 35 53 19 29
  17. 3 56 77 66 21 51
  18. 4 67 67 67 0 62

 

 

文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Chenftli/article/details/85231035

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。