pandas ---- pd.Series基本用法

本文详述了pandas库中pd.Series的创建、属性与方法,包括创建方法、属性(如index、value、shape等)、数据处理(如转换、排序、缺失值处理)以及索引、切片和布尔索引等操作。重点介绍了Series的常用方法,如head/tail、describe、sort_values/index、astype、apply、统计方法等。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


引言

本部分主要介绍一些注意事项。


一 pd.Series的创建

pd.Series(data,index,dtype)---- 创建一维pd.Series;特别是其中的通过字典创建

pd.Series 的主要参数有以下几个:

  1. data:Series 的数据,可以是列表、数组、字典等。如果是字典,字典的键将成为 Series 的索引,字典的值将成为 Series 的数据。

  2. index:用于指定 Series 的索引,可以是列表、数组、索引对象(如 pd.Index 对象)、标量或者 None。如果不提供索引,将默认使用从 0 开始的整数索引。

  3. dtype:指定 Series 的数据类型。如果不指定,将根据数据类型推断。
    下面是一些示例:

示例1:不定义index

# 通过列表创建 Series,不定义index会自动生成0....index
data = [1, 2, 3, 4, 5]
s = pd.Series(data)
print(s)           # 0    1
                   # 1    2
                   # 2    3
                   # 3    4
                   # 4    5
                   # dtype: int64

示例2:自定义index

data = [1, 2, 3, 4, 5]
# 自定义索引
index = ['a', 'b', 'c', 'd', 'e']
s = pd.Series(data, index=index)
print(s)                  
                            # a    1
                            # b    2
                            # c    3
                            # d    4
                            # e    5
                            # dtype: int64

示例3:通过字典创建

# 通过字典创建 Series
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
s = pd.Series(data)
print(s)                
                        # a    1
                        # b    2
                        # c    3
                        # d    4
                        # e    5
                        # dtype: int64

二 pd.Series的常用属性与方法

1 pd.Series的常用属性

s.index ---- 返回值是一个index对象,需要用 to_list()或to_numpy()转换过去

s.value ---- 返回值是一个 numpy数组

s.shape ---- 形状

s.size ---- 元素总数

s.dtype

在pandas里面 str 数据类型也是用 object表示的
在 Pandas 中,dtype: object 表示该列或 Series 中包含了一种通用的对象类型。通常,object 数据类型用于存储字符串,但它也可以存储其他类型的对象,例如列表、字典,甚至是混合类型的数据。

# 通过字典创建 Series
data_int = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
data_str = {'a': 'apple', 'b': 'banana', 'c': 'cat', 'd': 'dog', 'e': 'elephant'}
data_obj = {'a': 1, 'b': 'banana', 'c': 3, 'd': 'dog', 'e': 5}
int_ = pd.Series(data_int)
str_ = pd.Series(data_str)
obj_ = pd.Series(data_obj)
print(int_)                
                        # a    1
                        # b    2
                        # c    3
                        # d    4
                        # e    5
                        # dtype: int64
print(str_)             
                        # a       apple
                        # b      banana
                        # c         cat
                        # d         dog
                        # e    elephant
                        # dtype: object
print(obj_)
                        # a         1
                        # b    banana
                        # c         3
                        # d       dog
                        # e         5
                        # dtype: object
# 属性(部分)
print(int_.dtype)      # int64
print(str_.dtype)      # object
print(obj_.dtype)      # object

s.ndim ---- 一维数组维数,永远是1

# 通过字典创建 Series
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
s = pd.Series(data)

print(s.dtype)  # int64
print(s.shape)  # (5,)   pd.Series 是一维数组
print(s.index)  # Index(['a', 'b', 'c', 'd', 'e'], dtype='object')  这是一个索引对象
print(s.values)  # [1 2 3 4 5]  这是一个numpy数组
print(s.ndim)    # 1  永远是1
print(s.size)    # 5  元素个数

2 pd.Series的常用方法

(1)基本方法

s.head() — 默认是查看前5行
s.tail() — 默认是查看后5行
# 通过字典创建 Series
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
s = pd.Series(data)

print(s.head(2))    # a    1
                    # b    2
                    # dtype: int64
                    
print(s.tail(2))    # e    5
                    # f    6
                    # dtype: int64
s.describe() — 生成描述性统计信息
# 通过字典创建 Series
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
s = pd.Series(data)

print(s.describe())    
                        # count    6.000000
                        # mean     3.500000
                        # std      1.870829
                        # min      1.000000
                        # 25%      2.250000
                        # 50%      3.500000
                        # 75%      4.750000
                        # max      6.000000
                        # dtype: float64
s.unique() ---- 返回 Series 中唯一值的numpy数组
# 通过字典创建 Series
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 5}
s = pd.Series(data)

print(s.unique())           # [1 2 3 4 5] numpy.ndarray 

(2) 排序

s.sort_values(ascending=True) ------ 根据值排序
s.sort_index(ascending=True) ------ 根据索引排序
# 通过字典创建 Series
data = {'f': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'a': 1}
s = pd.Series(data)

print(s.sort_values())           # 按值排序
                                    # f    1
                                    # a    1
                                    # b    2
                                    # c    3
                                    # d    4
                                    # e    5
                                    # dtype: int64
print(s.sort_index())            # 按索引排序
                                    # a    1
                                    # b    2
                                    # c    3
                                    # d    4
                                    # e    5
                                    # f    1
                                    # dtype: int64
  • 按值排序:Series 中的值按照升序排列,索引随之重新排列
  • 按索引排序:Series 中的索引按照字母顺序进行排列,对应的值随之重新排列。
s.rank(method=‘average’, na_option=‘keep’, ascending=True): 返回每个元素的排名。— 待更新

待更新

(3)数据处理(转换)

s.astype(dtype) ---- 转换 Series 的数据类型。有返回值,无inplace参数。

如果是 object 数据类型转换会报错。

data = {'f': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'a': 1}
s = pd.Series(data)

print(s.astype(float))     # f   1.0
                           # b    2.0
                           # c    3.0
                           # d    4.0
                           # e    5.0
                           # a    1.0
                           # dtype: float64
.to_list() ---- 将 Series 转换为 Python 列表。
# 通过字典创建 Series
data = {'f': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'a': 1}
s = pd.Series(data)
print(s.to_list())          # [1, 2, 3, 4, 5, 1]   value to list
print(s.index.to_list())    # ['f', 'b', 'c', 'd', 'e', 'a']   index to list
.to_numpy(): 将 Series 转换为 NumPy 数组。
# 通过字典创建 Series
data = {'f': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'a': 1}
s = pd.Series(data)
print(s.to_numpy())           # [1 2 3 4 5 1] 
print(s.index.to_numpy())     # ['f' 'b' 'c' 'd' 'e' 'a']

# 另外s.values本来返回的就是numpy数组  
.to_frame(name=‘col_name’) — 将 Series 转换为 DataFrame。name='col_name’指定列名
# 通过字典创建 Series
data = {'f': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'a': 1}
s = pd.Series(data)
# 将 Series 转换为 DataFrame,并指定新的列名
df = s.to_frame(name='col_name')

print(df)           #          col_name
                        # f      1
                        # b      2
                        # c      3
                        # d      4
                        # e      5
                        # a      1   
.reset_index() ----- 重置索引

使用 reset_index() 方法重置索引。
比较常用,有时通过布尔过滤选择数据返回的数据index是乱的,我们调用这个方法,index就会重新编号成0,1,2…
【注】:需要传入drop=True表明丢弃原来的索引,反之效果看下面代码给演示一下吧,不是很好叙述。
【注】:可以设置 inplace = True 改为原地操作(不过慎用 inplace,危险操作,开发中极有可能将你原始数据修改了)

# 创建一个示例 Series
s = pd.Series([3, 1, 2, 4, 5])
s = s[s >= 3]
print(s)                # 0    3
                        # 3    4
                        # 4    5
                        # dtype: int64


# 重新设置索引,并丢弃原始索引
s_reset = s.reset_index(drop=True)
# s.reset_index(drop=True, inplace=True) # 原地操作
print(s_reset)              # 0    3
                            # 1    4
                            # 2    5
                            # dtype: int64  

【注】:如果不设置drop=True就会将原来索引保持下来,并当成Dataframe的一列保存下来,因此会返回一个Dataframe,像下面这样:
在这里插入图片描述
【注】:Dataframe里面也要 .reset_index(drop=True,inplace=True)
【注】:set_index()只有dataframe有,series没有

缺失值处理
s.isnull() — 返回一个布尔数组,指示每个元素是否为 NaN。
# 创建一个含有缺失值的 Series
s_with_nan = pd.Series([1, 2, None, 4, 5])
print(s_with_nan)          

# 检测缺失值,返回一个布尔series
print(s_with_nan.isnull())        # 0    False
                                  # 1    False
                                  # 2     True
                                  # 3    False
                                  # 4    False
                                  # dtype: bool
# 结合布尔过滤就能返回缺失值的数据了
print(s_with_nan[s_with_nan.isnull()])          # 2   NaN
                                                # dtype: float64  
s.fillna(value=None, method=None) ---- 用指定值或方法填充 NaN。

填充方法有 使用固定值,向前填充和向后填充三种方法。

# 创建一个含有 NaN 的 Series
s = pd.Series([1, 2, None, 4, None, 6])

# 用指定值填充 NaN
# filled_s = s.fillna(0)     也是一样的
filled_s = s.fillna(value=0)

## 用向前填充的方法填充 NaN
# filled_s = s.fillna(method='ffill')

## 用向后填充的方法填充 NaN
# filled_s = s.fillna(method='bfill')

print(filled_s)
s.dropna(): 删除包含 NaN 的行。
s_dropped = s_with_nan.dropna()
s .drop(index) ---- 删除指定索引行
# 创建一个示例 Series
data = {'a': 1, 'b': 2, 'c': 3}
s = pd.Series(data)
print(s)              # a    1
                      # b    2
                      # c    3
                      # dtype: int64

# 删除索引为 'b' 的元素
new_s = s.drop('b')
print(new_s)          # a    1
                      # c    3
                      # dtype: int64
高级用法(.apply(func))---- 元素级操作,将指定函数应用于 Series 中的每个元素,并返回结果。
# 创建 Series
s = pd.Series([1, 2, 3, 4, 5])

# 使用 apply 方法和 lambda 匿名函数,对每个元素进行平方操作
s_applied = s.apply(lambda x: x ** 2)
print(s_applied)                  # 0     1
                                  # 1     4
                                  # 2     9
                                  # 3    16
                                  # 4    25
                                  # dtype: int64  
def f(x):
    return x**2
# 创建 Series
s = pd.Series([1, 2, 3, 4, 5])

# 使用 apply 方法和 自定义的函数
s_applied = s.apply(f)
print(s_applied)         # 0     1
                          # 1     4
                          # 2     9
                          # 3    16
                          # 4    25
                          # dtype: int64
统计方法
.sum(): 返回所有元素的和。
.mean(): 返回所有元素的均值。
.median(): 返回所有元素的中位数。
.std(): 返回样本标准差。
.var(): 返回样本方差。
.min(): 返回最小值。
.max(): 返回最大值。
.quantile(q=0.5, interpolation=‘linear’): 返回第 q 个分位数值。
.mad(): 返回平均绝对偏差。
.corr(other, method=‘pearson’, min_periods=None): 计算与另一 Series 的相关系数。
.cov(other, min_periods=None, ddof=1): 计算与另一 Series 的协方差。
.count(level=None): 计算非 NA/null 值的数量
.cumsum(axis=0, skipna=True): 返回累积和
.cumprod(axis=0, skipna=True): 返回累积积

(4) 空series及其判断

import pandas as pd

# 创建一个空的 Series
empty_series = pd.Series()
print(empty_series)

# 判断 Series 是否为空
if empty_series.empty:
    print("Series 是空的。")
else:
    print("Series 不是空的。")

输出:
在这里插入图片描述

三 series的访问、索引、切片、布尔索引等操作

1 索引访问、整数数组访问

# 创建Series
data = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
s = pd.Series(data)
# 访问数据
print('自定义index访问单个元素:,'s['a'])                  # 访问单个元素,返回的类型就是里面数据类型                    1
print('位置索引访问单个元素:',s[1])                       # 也可以通过位置索引访问,,返回的类型就是里面数据类型           2
print('索引列表访问多个元素1:\n',s[['a', 'b', 'c']])      # 通过索引列表访问多个元素,返回的数据类型(包括一条数据)都是pd.Series       
# a    1                                                                                                                        # b    2                                                                                                                      # c    3                                                                                                                   # dtype: int64

【注】:需要注意的就是仅取一个数据时的数据类型是什么;以及索引列表是不支持位置index的,只支持具体的index(除非就是使用默认的位置索引作为索引)

2 切片

【注】:位置索引切片(左闭右开)和自定义索引切片都支持(左闭右闭)

# 创建Series
data = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
s = pd.Series(data)
# 切片至少会有两个数据吧,所以类型一定是pd.Series
print(s[1:3])               # b    2
                            # c    3
                            # dtype: int64
                            
print(s['b':'d'])           # b    2
                            # c    3
                            # d    4
                            # dtype: int64

3 布尔数组索引访问

# 创建Series
data = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
s = pd.Series(data)
print('s>2',s[s > 2])           # c   3
                                # d   4
                                # e   5 
                                # f   6
                                # dtype: int64
                    
print('s==2',s[s == 2])
                                # b   2
                                # dtype: int64  

4 loc 与 iloc

其实用法包含了前面1,2,3;会了loc与iloc就能做到前面1,2,3一样的,里面功能一模一样,只是调用方式不同而已
在 Pandas 中,Series 对象的 loc[] 和 iloc[] 方法用于选择和过滤数据。以下是它们的详细说明和用法:

loc[] 方法

loc[] 方法是基于标签(标签索引)的选择方法。可以使用标签索引来访问和过滤数据。
用法:

(1).单个标签选择: series.loc[label]
(2).标签列表选择: series.loc[[label1, label2, …]]
(3).标签范围选择: series.loc[label1:label2]
(4).布尔数组选择: series.loc[boolean_array]

创建一个 Series

data = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
单个标签选择
print(data.loc['b'])  # 20
标签列表选择
print(data.loc[['b', 'd']])     # b  20
                                # d  40 
                                # dtype: int64
标签范围选择
print(data.loc['b':'d'])        # b    20
                                # c    30
                                # d    40
                                # dtype: int64
布尔数组选择
print(data.loc[data>20])       # c    30
                                # d    40
                                # e    50
                                # dtype: int64
汇总
data = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
print(data.loc['b'])  # 20

print(data.loc[['b', 'd']])     # b  20
                                # d  40 
                                # dtype: int64

print(data.loc['b':'d'])        # b    20
                                # c    30
                                # d    40
                                # dtype: int64
                                
print(data.loc[data>20])       # c    30
                                # d    40
                                # e    50
                                # dtype: int64

iloc[] 方法

iloc[] 方法是基于整数位置的选择方法。使用整数位置来访问和过滤数据。
用法:

(1).单个整数位置选择: series.iloc[position]
(2).整数位置列表选择: series.iloc[[position1, position2, …]]
(3).整数位置范围选择: series.iloc[start:stop]
(4).布尔数组选择: series.iloc[boolean_array]

创建一个 Series

data = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
单个整数位置选择
print(data.iloc[1])  # 20
整数位置列表选择
print(data.iloc[[1, 3]])        # b  20
                                # d  40 
                                # dtype: int64
整数位置范围选择
print(data.iloc[1:4])           # b    20
                                # c    30
                                # d    40
                                # dtype: int64

[注]:自定义index都是左闭右闭,默认位置index是左闭右开。

iloc不支持series布尔数组选择,只支持布尔列表,布尔numpy数组等布尔访问

因为 loc和iloc设计上的不同,loc支持series布尔索引,iloc不支持series布尔索引,只能使用 s[s>20]或者先转换成布尔列表在布尔访问。下面给出来几种解决方法。

data = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])

print(data[data>20])            # c    30
                                # d    40
                                # e    50
                                # dtype: int64

index: pd.Series = data>20
print(data[index.to_list()])    # c    30
                                # d    40
                                # e    50
                                # dtype: int64
                                
print(data[index.values])       # values属性本身就是一个numpy数组所以也可以这样
								# c    30
                                # d    40
                                # e    50
                                # dtype: int64
                                                             
print(data.iloc[data>20])       # ValueError: iLocation based boolean indexing cannot use an indexable as a mask   
                                # 应为 data>20返回的是一个布尔Series,iloc不支持布尔Series索引,可以将其转换为布尔列表
汇总
data = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
print(data.iloc[1])  # 20

print(data.iloc[[1, 3]])        # b  20
                                # d  40 
                                # dtype: int64

print(data.iloc[1:4])           # b    20
                                # c    30
                                # d    40
                                # dtype: int64

【注意事项】

(1).loc[] 基于标签索引,如果标签是整数,则必须传递标签值,而不是位置。
(2).iloc[] 基于整数位置,无论索引是什么类型,都可以使用整数位置进行访问。
(3).使用布尔数组进行loc选择时,数组的长度必须与 Series 的长度一致。

5 at[],iat[],get() — 待更新

at[]: 获取单个标签位置的标量值。
iat[]: 获取单个整数位置的标量值。
get(key, default=None): 根据标签获取值,如果标签不存在则返回默认值。
待更新 ---- 这块暂时用的不多,后面在更新

6 使用索引访问等修改Series — 待更新

待更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值