pandas中pandas.Series.apply和pandas.DataFrame.apply的用法与比较
Series.apply
(func, convert_dtype=True, args=(), **kwds)
func:对Series的值调用函数。可以是ufunc(适用于整个Series的NumPy函数)或仅对单个值工作的Python函数
convert_dtype: 尝试为基本函数结果找到更好的元素类型(dtype)。如果为False,则元素类型(dtype)为object类型
args: 除了值之外,还要传递给函数的位置参数
**kwds : 传递给函数的字典参数(多个传递给函数的参数)
实例:
-
df5 = pd.Series([1, 3, 4, 5], index=['a', 'b', 'c', 'd'])
-
-
# convert_dtype为False时,返回的元素类型是object,如果为True时,返回的是int64
-
df3 = df5.apply(lambda x: x**2, convert_dtype=False)
-
print(df3)
-
-
def subtract(x, value):
-
return x - value
-
-
-
def add(x, **kwargs):
-
for key, value in kwargs.items():
-
x += value
-
return x
-
-
# **kwarg接收传递的字典参数
-
df6 = df5.apply(add, ag=1, ql=2, sd=3)
-
print(df6)
-
-
# value接收了传递的元组参数
-
df7 = df5.apply(subtract, args=(1,))
-
print(df7)
-
-
# function可以用numpy库提供的函数
-
df8 = df5.apply(np.log)
-
print(df8)
总结:可以发现apply在Serise中是将函数应用于整个Serise元素,但是如果一个Serise索引中有多个元素时,就无法用apply直接实现每个元素的函数功能,因为传递进x的是列表,没办法用列表运算,这时还得再遍历一次,才能发挥apply函数的功能,如下代码(如果这里你想到Dataframe中的df4.a.apply()用法,同样的道理,列表是不会有apply()的用法的)。
-
df4 = pd.Series([[1, 3, 5], [3, 9, 0], [4, 8, 0], [5, 7, 5]], index=['a', 'b', 'c', 'd'])
-
# 这里用列表函数将匿名函数传进来的x再次遍历计算
-
df4 = df4.apply(lambda x: [i**2 for i in x])
-
print(df4)
DataFrame.
apply
(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **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结果。
其他的同上。
-
df2 = pd.DataFrame({'manage_score': [12, 34, 34, 56, 67], 'math_score': [23, 52, 35, 77, 67], 'english_score': [90, 23, 53, 66, 67]})
-
df2['a'] = df2.apply(lambda x: x.max() - x.min(), axis=1)
-
print(df2)
-
-
df2['b'] = df2.manage_score.apply(lambda x: x - 5)
-
print(df2)
-
-
-
结果:
-
manage_score math_score english_score a
-
0 12 23 90 78
-
1 34 52 23 29
-
2 34 35 53 19
-
3 56 77 66 21
-
4 67 67 67 0
-
manage_score math_score english_score a b
-
0 12 23 90 78 7
-
1 34 52 23 29 29
-
2 34 35 53 19 29
-
3 56 77 66 21 51
-
4 67 67 67 0 62
文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Chenftli/article/details/85231035
- 点赞
- 收藏
- 关注作者
评论(0)