pandas.Series.apply和pandas.DataFrame.apply

1,039

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  • Series.apply(funcconvert_dtype=Trueargs=()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(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结果。

其他的同上。

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