在python的pandas中,apply函数是一个常用的操作函数,它可以对数据框进行行或列或元素的操作,可以返回一个标量、一个Series或一个新的DataFrame。同样地,apply也支持返回多列。
我们需要定义一个要被apply的函数,并使用apply函数调用该函数,代码如下:
def func(row):
# do something
return pd.Series([val1, val2, val3])
df.apply(func, axis=1)
其中axis=1
表示对行进行操作,func
是对每一行所执行的函数,返回值需要是一个Series,该Series包含了所有想要返回的列。例如这个示例中,我们想要返回三列val1
,val2
和val3
。
我们来看一个实际的例子:
假设我们有一个数据框,其中有三列id
,age
和height
。我们想要根据年龄段分类,并统计每个年龄段中身高的贡献度。
import pandas as pd
import numpy as np
data = {
'id': ['001', '002', '003', '004', '005', '006', '007', '008', '009', '010'],
'age': [20, 21, 20, 23, 25, 26, 21, 22, 23, 24],
'height': [176, 172, 179, 182, 166, 178, 183, 175, 171, 184],
}
df = pd.DataFrame(data)
def contribution(row):
row['contribution'] = row['height'] / row['height'].sum()
return row
df.groupby('age').apply(contribution)
经过上述代码的处理,我们将新的列contribution
加入到了原数据框中,并且同时统计了每个年龄段中身高的贡献度。
再看一个简单的例子,假设我们有一个数据框,其中有三列a
,b
和c
。我们想要根据a
和b
的值统计c
的和以及c
中每个元素的平均值。
import pandas as pd
import numpy as np
data = {
'a': [1, 2, 1, 2, 1, 2],
'b': [3, 4, 3, 4, 3, 4],
'c': [5, 7, 9, 11, 13, 15]
}
df = pd.DataFrame(data)
def agg_func(x):
return pd.Series({
'sum_c': np.sum(x['c']),
'mean_c': np.mean(x['c']),
})
df.groupby(['a', 'b']).apply(agg_func)
我们首先使用groupby
函数根据a
和b
的值进行分组,然后使用apply
函数调用agg_func
函数,该函数会返回一个包含两个元素的Series:sum_c
和mean_c
。最终结果为一个以a
和b
为索引的新数据框,该数据框中包含两列:sum_c
和mean_c
。
本文链接:http://task.lmcjl.com/news/17482.html