Pandas-02(描述性统计、函数的应用、重建索引、迭代)

本文介绍了Pandas库中用于数据统计、函数应用和索引操作的方法。包括描述性统计如mean、std、min、max等,以及apply、agg、transform和applymap函数在Series和DataFrame上的应用。还详细阐述了reindex、reset_index、fillna、rename等索引重建和管理技巧,展示了如何通过迭代遍历DataFrame内容。
摘要由CSDN通过智能技术生成

目录

1.描述性统计

 1.1 常用描述性统计

 1.2 数据总结:describe()

 2. 函数的应用

 2.1  pipe()表级函数的应用

 2.2  apply()行列级函数应用

 2.3  agg();transform()聚合 API

 2.4 applymap()元素级函数应用

3. 重建索引

3.1 重建索引

3.2 重置索引,填充空值

3.3  重置索引,并与其它对象对齐

3.4 重命名索引

4.迭代

4.1 基础迭代for in循环

4.2 字典式item()迭代


1.描述性统计

Series与 DataFrame支持大量计算描述性统计的方法与操作。这些方法大部分都是 sum()mean()quantile()等聚合函数,其输出结果比原始数据集小;此外,还有输出结果与原始数据集同样大小的 cumsum()、 cumprod()等函数。这些方法都基本上都接受 axis 参数,如, ndarray.{sum,std,…},但这里的 axis 可以用名称或整数指定:

  • Series:无需 axis 参数
  • DataFrame
    • index,即 axis=0,默认值
    • columns, 即 axis=1

 1.1 常用描述性统计

函数描述
count统计非空值数量
sum汇总值
mean平均值
mad平均绝对偏差
median算数中位数
min最小值
max最大值
mode众数
abs绝对值
prod乘积
std贝塞尔校正的样本标准偏差
var无偏方差
sem平均值的标准误差
skew样本偏度 (第三阶)
kurt样本峰度 (第四阶)
quantile样本分位数 (不同 % 的值)
cumsum累加
cumprod累乘
cummax累积最大值
cummin累积最小值

示例如下:

import pandas as pd
import numpy as np

d = {
    "name":pd.Series(['小明','小黑','小红']),
    'age':pd.Series([12,16,14]),
    'score':pd.Series([98,90,77])
}

df = pd.DataFrame(d)

#sum求和函数,按照轴进行求和,默认是按照列轴,axis = 0
df.sum()

#设置按行求和,axis =1
df.sum(1)

# 求平均
df.mean()

# 求标准差
df.std()

# 求列最小值
df.min()

# 求列最大值
df.max()

# 求age和score列的绝对值
df[['age','score']].abs()

输出结果:

    name   age	score
0	小明	12	98
1	小黑	16	90
2	小红	14	77

#sum求和函数,按照轴进行求和,默认是按照列轴,axis = 0
name     小明小黑小红
age          42
score       265
dtype: object

#设置按行求和,axis =1
0    110
1    106
2     91
dtype: int64

# 求平均
age      14.000000
score    88.333333
dtype: float64

# 求标准差
age       2.000000
score    10.598742
dtype: float64

# 求最小值
name     小明
age      12
score    77
dtype: object

# 求最大值
name     小黑
age      16
score    98
dtype: object

# 求age和score列的绝对值
   age	score
0	12	98
1	16	90
2	14	77

 1.2 数据总结:describe()

describe()函数计算Series 与 DataFrame 数据列的各种数据统计量,注意,这里排除了空值

示例:接上述案例实例化的dataframe对象

# 数据描述
df.describe()

# 使用include/exclude指定或排除描述的参数类型,如object,number,all等类型
df.describe(include="object")
df.describe(include="number")
df.describe(include="all")

输出结果:

df.describe()

df.describe(include="object") 

 

 df.describe(include="number")

 df.describe(include="all")

 2. 函数的应用

不管是为 Pandas 对象应用自定义函数,还是应用第三方函数,都离不开以下三种方法。用哪种方法取决于操作的对象是 DataFrame,还是 Series ;是行、列,还是元素。

  1. 表级函数应用:pipe()

  2. 行列级函数应用: apply()

  3. 聚合 API: agg()与 transform()

  4. 元素级函数应用:applymap()

2.1  pipe()表级函数的应用

在pipe(fn,args)函数中,会将dataframe作为函数fn传入的第一个参数,args等后续参数作为函数传入的后续参数。例如下面案例中,将以df内的数据为add()传入的ele1,将2作为ele2。

示例:

# 需要将df中所有元素的内容加2
import pandas as pd
import numpy as np

def add(ele1,ele2):
    return ele1+ele2

df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
print(df)


# pipe()
df.pipe(add,2)
print(df)

实现效果:

原始df:

 调用add函数后的df:

 2.2  apply()行列级函数应用

apply()方法沿着 DataFrame 的轴应用函数,比如,描述性统计方法,该方法支持 axis 参数。

默认情况下,apply()方法调用的函数返回的类型会影响 DataFrame.apply 输出结果的类型。

  • 函数返回的是 Series 时,最终输出结果是 DataFrame。输出的列与函数返回的 Series 索引相匹配。

  • 函数返回其它任意类型时,输出结果是 Series

基本语法:

apply(fn,axis)

例如计算沿水平方向的标准差:

df.apply(np.std,axis=1) #根据水平计算

输出结果:

 2.3  agg();transform()聚合 API

agg()与transform()函数的用法基本相同,但transform()方法返回的结果与原始数据索引相同,大小相同。下面以agg()方法为例进行使用。

1.  单聚合模式

agg()应用单个函数时,该操作与apply()等效,这里也可以用字符串表示聚合函数名。例如:

df.apply(np.std) 
==
df.agg(np.std)

2. 多聚和模式

还可以用列表形式传递多个聚合函数。每个函数在输出结果 DataFrame 里以行的形式显示,行名是每个聚合函数的函数名。

例如聚合上述dataframe中每一列的总和标准差:

df.agg(['sum',np.std])

输出结果:

或使用字典实现聚合:

df.agg({'col1': 'mean', 'col2': 'sum','col3':'std'})

 

 2.4 applymap()元素级函数应用

 并非所有函数都能矢量化,即接受 NumPy 数组,返回另一个数组或值,DataFrame 的 applymap()及 Series 的 map(),支持任何接收单个值并返回单个值的 Python 函数。

例如使用applymap()对每一个元素进行乘以100的操作:

#applymap每一个元素进行操作
df.applymap(lambda x:x*100)

实现效果:

3. 重建索引

reindex()是 Pandas 里实现数据对齐的基本方法,该方法执行几乎所有功能都要用到的标签对齐功能。 reindex 指的是沿着指定轴,让数据与给定的一组标签进行匹配。该功能完成以下几项操作:

  • 让现有数据匹配一组新标签,并重新排序;
  • 在无数据但有标签的位置插入缺失值(NA)标记;
  • 如果指定,则按逻辑填充无标签的数据,该操作多见于时间序列数据。

 示例:

3.1 重建索引

reindex(index,columns,axis)其中:

index为索引值(行);

columns为列值;

axis为轴,值为index或columns。

import pandas as pd
import numpy as np
df = pd.DataFrame({
    "a":pd.date_range(start='2020-01-01',periods=5,freq="D"),
    'b':[1,2,3,4,5],
    'c':[0.1,0.2,0.3,0.4,0.5]
})
df

#重建索引reIndex
df.reindex(index=[0,2,4],columns=['a','b','d'])
df

 初始dataframe:

 

重建索引后dataframe:

 

 3.2 重置索引,填充空值

方法动作
pad / ffill先前填充
bfill / backfill向后填充
nearest从最近的索引值填充
#向前填充
df.reindex(index=[0,5,6],columns=['a','b','c'],method="ffill")

 

3.3  重置索引,并与其它对象对齐

提取一个对象,并用另一个具有相同标签的对象 reindex 该对象的轴。这种操作的语法虽然简单,但未免有些啰嗦。这时,最好用reindex_like()方法,这是一种既有效,又简单的方式:

df1 = pd.DataFrame({
    "g":pd.date_range(start='2020-01-01',periods=5,freq="D"),
    'b':[1,2,3,4,5],
    'c':[0.1,0.2,0.3,0.4,0.5]
})
#填充加注
df.reindex_like(df1)

 

3.4 重命名索引

rename()方法支持按不同的轴基于映射(字典或 Series)调整标签。

基本语法:

df.rename(columns={'one': 'foo', 'two': 'bar'},index={'a': 'apple', 'b': 'banana'})

示例:

#重命名
df1.rename(columns={'g':"ggg",'b':'hello','c':"tom"})

 输出结果:

4.迭代

Pandas 对象基于类型进行迭代操作。Series 迭代时被视为数组,基础迭代生成值。DataFrame 则遵循字典式习语,用对象的 key 实现迭代操作。

4.1 基础迭代for in循环

基础迭代(for i in object)生成:

  • Series :值
  • DataFrame:列标签

 示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'date':pd.date_range(start='2020-01-01',periods=7,freq="D"),
    'a':np.linspace(0,6,7),
    'b':np.random.rand(7),
    'c':np.random.choice(['Low','Medium','High'],7).tolist(),
    'd':np.random.normal(100,10,size=(7)).tolist()
})

df

输出结果:

 使用基础迭代(for i in object)循环列数据:

#for in 循环,循环的是列
for col in df:
    print(col)
    print("-----------")
    print(df[col])

 输出结果:

date
-----------
0   2020-01-01
1   2020-01-02
2   2020-01-03
3   2020-01-04
4   2020-01-05
5   2020-01-06
6   2020-01-07
Name: date, dtype: datetime64[ns]
a
-----------
0    0.0
1    1.0
2    2.0
3    3.0
4    4.0
5    5.0
6    6.0
Name: a, dtype: float64
b
-----------
0    0.528330
1    0.690732
2    0.505649
3    0.572986
4    0.543452
5    0.092484
6    0.665942
Name: b, dtype: float64
c
-----------
0      High
1    Medium
2    Medium
3    Medium
4      High
5      High
6      High
Name: c, dtype: object
d
-----------
0     94.385040
1     87.748938
2    114.945423
3    107.408004
4     91.328902
5    105.160663
6     92.128187
Name: d, dtype: float64

4.2 字典式item()迭代

用下列方法可以迭代 DataFrame 里的行:

  • iterrows():把 DataFrame 里的行当作 (index, Series)对进行迭代。该操作把行转为 Series,同时改变数据类型,并对性能有影响。

  • itertuples()把 DataFrame 的行当作值的命名元组进行迭代。该操作比 iterrows()快的多,建议尽量用这种方法迭代 DataFrame 的值。

4.2.1 iteritem()

示例:

#iteritem
for key,value in df.iteritems():
    print(key)
    print(value)
    print("----------")

输出结果:

date
0   2020-01-01
1   2020-01-02
2   2020-01-03
3   2020-01-04
4   2020-01-05
5   2020-01-06
6   2020-01-07
Name: date, dtype: datetime64[ns]
----------
a
0    0.0
1    1.0
2    2.0
3    3.0
4    4.0
5    5.0
6    6.0
Name: a, dtype: float64
----------
b
0    0.528330
1    0.690732
2    0.505649
3    0.572986
4    0.543452
5    0.092484
6    0.665942
Name: b, dtype: float64
----------
c
0      High
1    Medium
2    Medium
3    Medium
4      High
5      High
6      High
Name: c, dtype: object
----------
d
0     94.385040
1     87.748938
2    114.945423
3    107.408004
4     91.328902
5    105.160663
6     92.128187
Name: d, dtype: float64
----------

4.2.2 iterrows()

# 取行值
for key,value in df.iterrows():
    print(key)
    print(value)

输出结果:

0
date    2020-01-01 00:00:00
a                         0
b                  0.325726
c                       Low
d                   79.9946
Name: 0, dtype: object
1
date    2020-01-02 00:00:00
a                         1
b                  0.507182
c                       Low
d                   92.1191
Name: 1, dtype: object
2
date    2020-01-03 00:00:00
a                         2
b                  0.219389
c                    Medium
d                   100.214
Name: 2, dtype: object
3
date    2020-01-04 00:00:00
a                         3
b                  0.466743
c                      High
d                   114.725
Name: 3, dtype: object
4
date    2020-01-05 00:00:00
a                         4
b                  0.268522
c                    Medium
d                   102.523
Name: 4, dtype: object
5
date    2020-01-06 00:00:00
a                         5
b                 0.0869462
c                      High
d                   91.1989
Name: 5, dtype: object
6
date    2020-01-07 00:00:00
a                         6
b                  0.599297
c                       Low
d                   112.741
Name: 6, dtype: object

4.2.3 itertuples()

# 取行内容
for row in df.itertuples():
    print(row)

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HM-hhxx!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值