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

目录

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)

输出结果:

猜你喜欢

转载自blog.csdn.net/damadashen/article/details/126897040