1.)apply作用于DF的列或行
2.)applymap作用于DF的所有元素(元素级别的操作)
3.)map作用于Series的所有元素(元素级别的操作)
4.)agg函数很多情况下都是和groupby组合使用,通常指代分组聚合,它和apply的区别不是很明显,一般当调用自定义函数,没有聚合这个概念时最好使用apply。
Dataframe中map(),apply(),applymap(),agg()函数区别与用法:
1.map()函数只能对Series的所有元素进行操作,即作用于Dataframe的单列,DataFrame的一列就是一个Series
2.applymap()函数对Dataframe的所有元素进行操作
3.apply()函数既能对Series的所有元素进行操作,也能对Dataframe的所有元素进行操作,还能对Series、Dataframe的列或行(axis=)进行操作
注:如果要对Dataframe多列进行操作,使用apply()
4.agg()函数一般和groupby()一起连用,先聚合,再对聚合后的列进行操作
链接:https://finthon.com/pandas-agg/
假设我们有这样一个数据:
import numpy as np
import pandas as pd
df = pd.DataFrame({‘k1’: list(‘aabba’), ‘k2’: [‘one’, ‘two’, ‘one’, ‘two’, ‘one’], ‘value1’: np.random.randn(5), ‘value2’: np.random.randn(5)})
df
k1 k2 value1 value2
0 a one 0.487768 3.194155
1 a two -1.798654 1.003257
2 b one 0.195446 -1.420604
3 b two -0.958120 -0.477421
4 a one -2.135973 0.239011
g1 = df.groupby(‘k1’)
1
2
3
4
5
6
7
8
9
10
11
12
13import numpy as np
import pandas as pd
df = pd.DataFrame({‘k1’: list(‘aabba’), ‘k2’: [‘one’, ‘two’, ‘one’, ‘two’, ‘one’], ‘value1’: np.random.randn(5), ‘value2’: np.random.randn(5)})
df
k1 k2 value1 value2
0 a one 0.487768 3.194155
1 a two -1.798654 1.003257
2 b one 0.195446 -1.420604
3 b two -0.958120 -0.477421
4 a one -2.135973 0.239011
g1 = df.groupby(‘k1’)
可以自定义一个计算最大和最小值的函数,并将这个函数传入agg方法中:
def cal_size(x):
return x.max() - x.min()
g1.agg(cal_size)
value1 value2
k1
a 2.623741 2.955143
b 1.153565 0.943184
1
2
3
4
5
6
7
8def cal_size(x):
return x.max() - x.min()
g1.agg(cal_size)
value1 value2
k1
a 2.623741 2.955143
b 1.153565 0.943184
面向列的多函数
agg方法不仅能够使用单个函数,而且还能对不同的列使用不同的聚合函数,或一次使用多个函数。对于上面表格中列出的统计方法,可以将函数名以字符串形式写入;
g1.agg(‘mean’)
value1 value2
k1
a -1.148953 1.478807
b -0.381337 -0.949012
1
2
3
4
5g1.agg(‘mean’)
value1 value2
k1
a -1.148953 1.478807
b -0.381337 -0.949012
还可以传入多个函数:
data = g1.agg([‘mean’, ‘std’, cal_size])
data
value1 value2
mean std cal_size mean std cal_size
k1
a -1.148953 1.427441 2.623741 1.478807 1.533894 2.955143
b -0.381337 0.815694 1.153565 -0.949012 0.666931 0.943184
data[‘value1’]
mean std cal_size
k1
a -1.148953 1.427441 2.623741
b -0.381337 0.815694 1.153565
1
2
3
4
5
6
7
8
9
10
11
12
13data = g1.agg([‘mean’, ‘std’, cal_size])
data
value1 value2
mean std cal_size mean std cal_size
k1
a -1.148953 1.427441 2.623741 1.478807 1.533894 2.955143
b -0.381337 0.815694 1.153565 -0.949012 0.666931 0.943184
data[‘value1’]
mean std cal_size
k1
a -1.148953 1.427441 2.623741
b -0.381337 0.815694 1.153565
当传入多个函数时,得到的列会以这个函数命名。如果想更改列名的话,我们可以传入一个 (name, function) 元组组成的列表。比如:
data1 = g1.agg([(‘average’, ‘mean’), (‘error’, ‘std’), (‘size’, cal_size)])
data1
value1 value2
average error size average error size
k1
a -1.148953 1.427441 2.623741 1.478807 1.533894 2.955143
b -0.381337 0.815694 1.153565 -0.949012 0.666931 0.943184
1
2
3
4
5
6
7data1 = g1.agg([(‘average’, ‘mean’), (‘error’, ‘std’), (‘size’, cal_size)])
data1
value1 value2
average error size average error size
k1
a -1.148953 1.427441 2.623741 1.478807 1.533894 2.955143
b -0.381337 0.815694 1.153565 -0.949012 0.666931 0.943184
除此之外,我们还可以针对不同的列使用不同的函数,只需要传入一个字典包含列名到函数的映射:
g1.agg({‘value1’: ‘sum’, ‘value2’: ‘mean’})
value1 value2
k1
a -3.446859 1.478807
b -0.762674 -0.949012
1
2
3
4
5g1.agg({‘value1’: ‘sum’, ‘value2’: ‘mean’})
value1 value2
k1
a -3.446859 1.478807
b -0.762674 -0.949012
在这里我们将对 value1 列使用 sum 函数,对 value2 列使用 mean 函数。
无索引形式
使用聚合方法得到的数据默认是把分组的列当成索引,有时候我们需要将分组索引也当成一列,此时就可以使用groupby方法中的 as_index=False 修改:
df.groupby(‘k1’, as_index=False).agg({‘value1’: ‘sum’, ‘value2’: ‘mean’})
k1 value1 value2
0 a -3.446859 1.478807
1 b -0.762674 -0.949012
1
2
3
4df.groupby(‘k1’, as_index=False).agg({‘value1’: ‘sum’, ‘value2’: ‘mean’})
k1 value1 value2
0 a -3.446859 1.478807
1 b -0.762674 -0.949012
这样索引值就变成了默认的,数据中又包含了 k1 列。
pandas 实现对一行中的多个列运算 ,生成新的列的方法,
之前找了很久没找到,后来发现其实就是eval方法,非常好用。
df.eval(‘new1 = 气温 + 湿度 + PM2P5’ , inplace=True)
inplace参数: 是否在原数据上操作。
inplace=False 将会生成新的DataFrame
一次新增多个列可以使用
df.eval("""
…: e = 气温 + 湿度
…: f = 气温 - 湿度
…: g = 气温 / 2.0""", inplace=True)
另外,还有一个查询的方法 query 也非常好用,同样也可以使用inpalce参数。
apply对两列进行操作:
def change(a,b):
if a ==“0至60” and b ==“否”
return 1
else:
return 0
df[“new_row”] = df.apply(lambda row: change(row[“a”],row[“b”]),axis=1)
Dataframe修改列名:
a.rename(columns={‘A’:‘a’, ‘B’:‘b’, ‘C’:‘c’}, inplace = True)
set_index()与reset_index()
set_index() 设置单索引和复合索引。
reset_index()还原索引
#创建一个空的Dataframe
result =pd.DataFrame(columns=(‘idx’,‘degree’,‘weight’,‘diameter’))#将计算结果逐行插入result,注意变量要用[]括起来,同时ignore_index=True,否则会报错,ValueError: If using all scalar values, you must pass an index
for i in idx:
degree=
weight=
diameter=
result=result.append(pd.DataFrame({‘idx’:[i],‘degree’:[degree],‘weight’:[weight],‘diameter’:[diameter]}),ignore_index=True)
pandas to_csv() 是可以向已经存在的具有相同结构的csv文件增加dataframe数据。
df.to_csv(‘my_csv.csv’, mode=‘a’, header=False)
to_csv()方法mode默认为w,我们加上mode=‘a’,便可以追加写入数据。
Dataframe分组排序
1.不分组直接排序
数据集
data[‘sort_num’]=data[‘comment_num’].rank(ascending=0,method=‘dense’)
结果:增加了一列,这列表示排序序号
rank()参数: ascending=0 表示倒序,ascending=1表示顺序
method=“dense” 表示相同大小的序号一样,下一个继续排。如 1 1 2 3 4 5
method=“first” 表示相同大小的序号最先出现为1,依次为12345
method=“min” 表示相同大小的取最小的排名序号
method=“max” 表示相同大小的取最大的排名序号
2.分组排序
数据集
先分组排序
增加序号