Dataframe的函数操作

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()
注意axis=1不能省

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
13

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’)
可以自定义一个计算最大和最小值的函数,并将这个函数传入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
8

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
面向列的多函数
agg方法不仅能够使用单个函数,而且还能对不同的列使用不同的聚合函数,或一次使用多个函数。对于上面表格中列出的统计方法,可以将函数名以字符串形式写入;

g1.agg(‘mean’)
value1 value2
k1
a -1.148953 1.478807
b -0.381337 -0.949012
1
2
3
4
5

g1.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
13

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
当传入多个函数时,得到的列会以这个函数命名。如果想更改列名的话,我们可以传入一个 (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
7

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
除此之外,我们还可以针对不同的列使用不同的函数,只需要传入一个字典包含列名到函数的映射:

g1.agg({‘value1’: ‘sum’, ‘value2’: ‘mean’})
value1 value2
k1
a -3.446859 1.478807
b -0.762674 -0.949012
1
2
3
4
5

g1.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
4

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
这样索引值就变成了默认的,数据中又包含了 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.分组排序
数据集
在这里插入图片描述
先分组排序
在这里插入图片描述
增加序号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值