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'])
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
df6 = df5.apply(add, ag=1, ql=2, sd=3)
print(df6)
df7 = df5.apply(subtract, args=(1,))
print(df7)
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
复制代码