Python-Pandas库

部分Pandas的函数

pandas作为python的十大流行库之一,是数据科学爱好者们经常用的数据分析工具,针对绝大多数业务场景,利用好它便可以轻松、高效地完成数据处理任务。

一、Groupby函数

1. 用法

根据某个(多个)字段划分为不同的群体(group)

例如:

先采用模拟生成10个样本数据

import pandas as pd
import numpy as np
company=["A","B","C"]

data=pd.DataFrame({
    "company":[company[x] for x in np.random.randint(0,len(company),10)],
    "salary":np.random.randint(5,50,10),
    "age":np.random.randint(15,50,10)
}
)
data

group = data.groupby("company") # 根据company字段对数据进行划分。
group

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7c7526bc8be0> # 得到一个DataFrameGroupBy对象及其地址

为了查看group中的内容,可以转换成list形式查看内容:

list(group)

上面的列表由三个元组成,每一个元组中,第一个元素是组别,第二个元素是对应组下的DataFrame

2.agg聚合操作

聚合操作可以用来求和、均值、最大值、最小值等

例如,想求上面不同公司的平均年龄和薪水:

data.groupby("company").agg('mean') # 按照公司分组后求平均年龄和薪水

3.transform操作

在上面的agg中求了不同公司员工的平均薪水,如果现在需要在原数据集中新增一列avg_salary,代表员工所在的公司的平均薪水(相同公司的员工具有一样的平均薪水),该怎么实现呢?如果按照正常的步骤来计算,需要先求得不同公司的平均薪水,然后按照员工和公司的对应关系填充到对应的位置,不用transform的话,实现代码如下:

avg_salary_dict = data.groupby('company')['salary'].mean().to_dict()# 求各公司的均值
data['avg_salary'] = data['company'].map(avg_salary_dict)# 添加到每一份员工上去
data# 打印输出

如果使用transform,仅需一行代码:

data['avg_salary'] = data.groupby('company')['salary'].transform('mean')

agg而言,会计算得到ABC公司对应的均值并直接返回,但对transform而言,则会对每一条数据求得相应的结果,同一组内的样本会有相同的值,组内求完均值后会按照原索引的顺序返回结果。

二、apply操作

它相比aggtransform而言更加灵活,能够传入任意自定义的函数,实现复杂的数据操作。

Pandas 的 apply() 方法是用来调用一个函数(Python method),让此函数对数据对象进行批量处理。Pandas 的很多对象都可以使用 apply() 来调用函数,如 Dataframe、Series、分组对象、各种时间序列等。

1.使用

apply() 使用时,通常放入一个 lambda 函数表达式、或一个函数作为操作运算,官方上给出DataFrame的 apply() 用法:

DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwargs)

参数:

func:函数或 lambda 表达式,应用于每行或者每列

axis:{0 or ‘index’, 1 or ‘columns’}, 默认为0
    0 or ‘index’: 表示函数处理的是每一列
    1 or ‘columns’: 表示函数处理的是每一行

raw:bool 类型,默认为 False;
    False ,表示把每一行或列作为 Series 传入函数中;
    True,表示接受的是 ndarray 数据类型;

result_type:{‘expand’, ‘reduce’, ‘broadcast’, None}, default None

These only act when axis=1 (columns):
    ‘expand’ : 列表式的结果将被转化为列。
    ‘reduce’ : 如果可能的话,返回一个 Series,而不是展开类似列表的结果。这与 expand 相反。
    ‘broadcast’ : 结果将被广播到 DataFrame 的原始形状,原始索引和列将被保留。

args: func 的位置参数

**kwargs:要作为关键字参数传递给 func 的其他关键字参数,

返回值:

Series 或者 DataFrame:沿数据的给定轴应用 func 的结果

2.使用案例

DataFrame与Series的区别与联系:

区别:

series,只是一个一维结构,它由index和value组成。
dataframe,是一个二维结构,除了拥有index和value之外,还拥有column。

联系:

dataframe由多个series组成,无论是行还是列,单独拆分出来都是一个series。

DataFrame使用apply

import pandas as pd
import numpy as np

df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
df

​ A B
0 4 9
1 4 9
2 4 9

# 使用numpy通用函数 (如 np.sqrt(df)),
df.apply(np.sqrt)
​	A    B
0  2.0  3.0
1  2.0  3.0
2  2.0  3.0
# 使用聚合功能
df.apply(np.sum, axis=0)

A 12
B 27
dtype: int64

df.apply(np.sum, axis=1)

0 13
1 13
2 13
dtype: int64

# 在每行上返回类似列表的内容
df.apply(lambda x: [1, 2], axis=1)

0 [1, 2]
1 [1, 2]
2 [1, 2]
dtype: object

# result_type='expand' 将类似列表的结果扩展到数据的列
df.apply(lambda x: [1, 2], axis=1, result_type='expand')

0 1
0 1 2
1 1 2
2 1 2

# 在函数中返回一个序列,生成的列名将是序列索引。
df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)

foo bar
0 1 2
1 1 2
2 1 2

# result_type='broadcast' 将确保函数返回相同的形状结果
# 无论是 list-like 还是 scalar,并沿轴进行广播
# 生成的列名将是原始列名。
df.apply(lambda x: [1, 2], axis=1, result_type='broadcast')

A B
0 1 2
1 1 2
2 1 2

Series使用apply

s = pd.Series([20, 21, 12],index=['London', 'New York', 'Helsinki'])
s
'''
London      20
New York    21
Helsinki    12
dtype: int64
'''

# 定义函数并将其作为参数传递给 apply,求值平方化。
def square(x):
     return x ** 2

s.apply(square)
'''
London      400
New York    441
Helsinki    144
dtype: int64
'''

# 通过将匿名函数作为参数传递给 apply
s.apply(lambda x: x ** 2)
'''
London      400
New York    441
Helsinki    144
dtype: int64
'''

# 定义一个需要附加位置参数的自定义函数
# 并使用args关键字传递这些附加参数。
def subtract_custom_value(x, custom_value):
     return x - custom_value

s.apply(subtract_custom_value, args=(5,))
'''
London      15
New York    16
Helsinki     7
dtype: int64
'''

# 定义一个接受关键字参数并将这些参数传递
# 给 apply 的自定义函数。
def add_custom_values(x, **kwargs):
     for month in kwargs:
         x += kwargs[month]
     return x

s.apply(add_custom_values, june=30, july=20, august=25)
'''
London      95
New York    96
Helsinki    87
dtype: int64
'''

# 使用Numpy库中的函数
s.apply(np.log)
'''
London      2.995732
New York    3.044522
Helsinki    2.484907
dtype: float64
'''

三、sort_values()排序

1.介绍

pandas中的sort_values()函数原理类似于SQL中的order by,可以将数据集依照某个字段中的数据进行排序,该函数即可根据指定列数据也可根据指定行的数据排序。

2.具体参数

DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)

image-20240327193654796

3.用法举例

#利用字典dict创建数据框
import numpy as np
import pandas as pd
df=pd.DataFrame({'col1':['A','A','B',np.nan,'D','C'],
                 'col2':[2,1,9,8,7,7],
                 'col3':[0,1,9,4,2,8]
})
print(df)

col1 col2 col3
0 A 2 0
1 A 1 1
2 B 9 9
3 NaN 8 4
4 D 7 2
5 C 7 8

#依据第一列排序,并将该列空值放在首位
print(df.sort_values(by=['col1'],na_position='first'))

col1 col2 col3
3 NaN 8 4
0 A 2 0
1 A 1 1
2 B 9 9
5 C 7 8
4 D 7 2

#依据第二、三列,数值降序排序
print(df.sort_values(by=['col2','col3'],ascending=False))

col1 col2 col3
2 B 9 9
3 NaN 8 4
5 C 7 8
4 D 7 2
0 A 2 0
1 A 1 1

#根据第一列中数值排序,按降序排列,并替换原数据
df.sort_values(by=['col1'],ascending=False,inplace=True,
                     na_position='first')
print(df)

col1 col2 col3
3 NaN 8 4
4 D 7 2
5 C 7 8
2 B 9 9
1 A 1 1
0 A 2 0

x = pd.DataFrame({'x1':[1,2,2,3],'x2':[4,3,2,1],'x3':[3,2,4,1]}) 
print(x)
#按照索引值为0的行,即第一行的值来降序排序
print(x.sort_values(by =0,ascending=False,axis=1))

x1 x2 x3
0 1 4 3
1 2 3 2
2 2 2 4
3 3 1 1
x2 x3 x1
0 4 3 1
1 3 2 2
2 2 4 2
3 1 1 3

四、iterrows()方法

Pandas的基础结构可以分为两种:数据框和序列。

数据框(DataFrame)是拥有轴标签的二维链表,换言之数据框是拥有标签的行和列组成的矩阵 - 列标签位列名,行标签为索引。Pandas中的行和列是Pandas序列 - 拥有轴标签的一维链表。

iterrows() 是在数据框中的行进行迭代的一个生成器,它返回每行的索引及一个包含行本身的对象。

所以,当我们在需要遍历行数据的时候,就可以使用 iterrows()方法实现了。

import pandas as pd
import numpy as np
# 生成一个随机的二维的数组
df = pd.DataFrame(np.random.randn(4, 2), columns=list('AB'))
df
for index, row in df.iterrows():
    print(index)
    print(row)

posted @ 2024-03-27 19:53  YJQING  阅读(28)  评论(0)    收藏  举报